2013-05-20 1 views
0

я ниже XMLпреобразования прямые котировки в смарт-кавычки

<para>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).</para> 

здесь фактически на входе котировки данные являются ", но я хочу, чтобы преобразовать его в смарт-кавычки. Я использовал ниже XSLT для этого .

<xsl:template match="para/text()"> 
<xsl:when test="contains(.,$quot)"> 
<xsl:value-of select="translate(.,$quot,'“')"/> 
<xsl:value-of select="translate(substring-after(.,$quot),$quot,'”')"/> 
</xsl:when> 
</xsl:template> 

но я получаю ниже ooutput.

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). 

, но я хочу, чтобы получить его, как показано ниже.

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). 

, пожалуйста, дайте мне знать, как я могу это решить.

Благодаря

+0

Вы можете использовать XSLT2.0 здесь? –

+0

Привет @TimC Я использую xslt 1.0 здесь –

+0

привет @TimC вы можете рассказать мне, как я это делаю –

ответ

0

Основная проблема, с вашим подходом является то, что перевести функцию заменят все вхождения кавычки с смарт-открытием цитатой. Поэтому последующая функция 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). 

 Смежные вопросы

  • Нет связанных вопросов^_^