Основная проблема, с вашим подходом является то, что перевести функцию заменят все вхождения кавычки с смарт-открытием цитатой. Поэтому последующая функция substring-after фактически не найдет ничего, потому что больше не будет найдены кавычки.
Что вам действительно нужно в этом случае является рекурсивным шаблон вместе с комбинацией обоих подстрок-перед тем и подстрока-после. Названный шаблон действительно может быть объединен с существующим шаблоном, с параметрами по умолчанию, которые будут использоваться в начальной игре
<xsl:template match="para/text()" name="replace">
<xsl:param name="text" select="."/>
<xsl:param name="usequote" select="$openquote"/>
($ openquote будет переменная, содержащая открытия цитаты)
Вы бы тогда проверьте, если выбранный текст содержит кавычки
<xsl:when test="contains($text,$quot)">
Если да, то вы бы первый выход текст перед кавычками, следуя за новой открытой цитатой
<xsl:value-of select="concat(substring-before($text, $quot), $usequote)"/>
После этого шаблон будет рекурсивно вызываться с текстом после цитаты и с закрытой цитатой в качестве параметра, поэтому следующий запрос цитаты будет закрыт.
<xsl:call-template name="replace">
<xsl:with-param name="text" select="substring-after($text,$quot)"/>
<xsl:with-param name="usequote"
select="substring(concat($openquote, $closequote), 2 - ($usequote=$closequote), 1)"/>
</xsl:call-template>
Примечание: выбирающий из usequote будет в основном переключаться между открытыми и близкими кавычками. Он использует тот факт, что «истина» оценивается как 1 в числовом выражении, а «false» - 0.
Попробуйте этот XSLT. Обратите внимание: в этом случае я использую открытые и закрывающие скобки, чтобы сделать вывод более четким, но вы можете легко изменить переменные на свои умные кавычки по мере необходимости. (Возможно, вам придется указывать кодировку для вывода в этом случае).
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:variable name="quot">"</xsl:variable>
<xsl:variable name="openquote">[</xsl:variable>
<xsl:variable name="closequote">]</xsl:variable>
<xsl:template match="para/text()" name="replace">
<xsl:param name="text" select="."/>
<xsl:param name="usequote" select="$openquote"/>
<xsl:choose>
<xsl:when test="contains($text,$quot)">
<xsl:value-of select="concat(substring-before($text, $quot), $usequote)"/>
<xsl:call-template name="replace">
<xsl:with-param name="text" select="substring-after($text,$quot)"/>
<xsl:with-param name="usequote"
select="substring(concat($openquote, $closequote), 2 - ($usequote=$closequote), 1)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Применительно к вашему XML, следующий выход
A number of the offences set out in the Companies Ordinance are expressed to apply to [officers] of the company. [Officer] includes directors, managers and the company secretary: Companies Ordinance, s.2(1).
Вы можете использовать XSLT2.0 здесь? –
Привет @TimC Я использую xslt 1.0 здесь –
привет @TimC вы можете рассказать мне, как я это делаю –