конкат, кавычка и апостроф - PullRequest
4 голосов
/ 09 января 2012

Я пробовал разные способы, а также огляделся, но не смог запустить.Мне нужно указать следующее:

"concat( 
    'this is; \"a sample',
    //XML_NODE,
    '\"; \"using an apostrophe',
    ''',
    'in text\"'
)"

однострочная версия:

"concat( 'this is; \"a sample', //XML_NODE, '\"; \"using an apostrophe', ''', 'in text\"' )"

Вывод должен быть:

this is "a sample XML_NODE_VALUE"; "using an apostrophe ' in text"

Проблема в том, что втекст.concat использует его для завершения строки и ожидает следующего;или конец concat.Кажется, что все экранирующие или HTML-сущности не работают.

Любая помощь действительно приветствуется.

Спасибо!

Ответы [ 3 ]

7 голосов
/ 09 января 2012

В XML / XSLT вы не экранируете символы с обратной косой чертой.

  • В XML вы можете использовать ссылки на сущности.
  • В XSLT вы можете использовать ссылки на сущности и переменные.

Проблема с апострофом внутри ваших строк concat заключается в том, что синтаксический анализатор XML, загружающий XSLT, расширит его до того, как concat будет оценен механизмом XSLT; поэтому вы не можете использовать ссылку на сущность для символа апостроф, если она не заключена в двойные кавычки (или ссылки на сущности для двойных кавычек, как показывает ответ Дмитрия Новатчева).

  • Используйте ссылку на сущность " для двойной кавычки ".
  • Создать переменную для символа апострофа и ссылаться на переменную как на один из компонентов concat ()

Применяется в контексте XSLT:

<xsl:variable name="apostrophe">'</xsl:variable>

<xsl:value-of select="concat( 
            'this is; &quot;a sample',
            //XML_NODE,
            '&quot;; &quot;using an apostrophe ',
            $apostrophe,
            ' in text&quot;'
            )" />

Если вам нужно решение XPath на 100%, которое избегает использования переменных XSLT, тогда ответ Димитра будет наилучшим.

Если вы обеспокоены тем, насколько легко читать, понимать и поддерживать, то предложение Майкла Кея использовать переменные XSLT для кавычки и апострофа может быть лучшим.

6 голосов
/ 09 января 2012

Переменная не требуется :

Вот пример того, как получить желаемый результат двумя способами:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:text>this is "a sample XML_NODE_VALUE"; "using an apostrophe ' in text"</xsl:text>
  =============
  <xsl:value-of select=
   "concat('this is ',
           '&quot;a sample XML_NODE_VALUE&quot;; &quot;',
           &quot;using an apostrophe &apos; in text&quot;,
           '&quot;'
          )
   "/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразованиеПрименительно к любому XML-документу (не используется), получается требуемый вывод :

this is "a sample XML_NODE_VALUE"; "using an apostrophe ' in text"
=============
this is "a sample XML_NODE_VALUE"; "using an apostrophe ' in text"
4 голосов
/ 09 января 2012

Я считаю, что самое простое решение - объявить переменные:

<xsl:variable name="apos">'</xsl:variable>
<xsl:variable name="quot">"</xsl:variable>
<xsl:value-of select="concat('This is ', $quot, "a sample using ", $apos)"/>
...