Подтвердить что ты не робот

Как избежать одиночной кавычки в функции подстроки xslt

Я попытался подстроить данные с помощью одной кавычки в XSLT:

String : DataFromXML:'12345'

Ожидаемый Результат: 12345

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:')"/>

Результат: '12345'

Я попытался под кодом

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&#39;')"/>

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&apos;')"/>

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:'')"/>

Ошибка:

String literal was not closed 'DataFromXML:'--->'<---
4b9b3361

Ответ 1

Общие правила экранирования:

В 1.0:

  • если вы хотите использовать разделитель атрибутов в строковом литерале, используйте XML escape-форма &quot; или &apos;
  • Если вы хотите, чтобы разделитель строк в строковом литерале, вы hosed

В 2.0:

  • если вы хотите использовать разделитель атрибутов в строковом литерале, используйте XML escape-форма &quot; или &apos;
  • если вы хотите, чтобы разделитель строк был в строковом литерале, удвойте его (для Например, "Я не могу" )

Использование переменной $quot или $apos, как показано Виталием, может сделать код более понятным.

Ответ 2

Это должно работать:

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

...

<xsl:value-of select="substring-before(substring-after($datafromxml, concat('DataFromXML:', $apos)), $apos)" />

Ответ 3

Вы можете попробовать выполнить обмен и "и" в xsl: значение

<xsl:value-of select='substring-before
   (substring-after($datafromxml,"DataFromXML:&apos;"), "&apos;")'/> 

В качестве альтернативы вы можете использовать функцию перевода для удаления надоедливых апострофов

 <xsl:value-of select='translate
    (substring-after($datafromxml,"DataFromXML:"), "&apos;", "")'/> 

Не обязательно приятнее, но это устраняет необходимость в переменной.

Ответ 4

Даже в самом сложном случае - строка содержит как цитату, так и апостроф - номер может быть извлечен без использования переменных.

Предположим, что у нас есть этот документ XML:

<t>' "12345' "</t>

и хотите получить только число.

В следующем преобразовании мы используем одно выражение XPath, чтобы сделать именно это:

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

 <xsl:template match="text()">
     <xsl:value-of select=
     'substring-after(.,"&apos;")
     '/>
==============  
     <xsl:value-of select=
     'substring-before(
       substring-after(substring-after(.,"&apos;"), &apos;&quot;&apos;),
       "&apos;"
                       )
     '/>
 </xsl:template>
</xsl:stylesheet>

Результат:

 "12345' "
==============  
     12345

Обратите внимание. Я намеренно имею два выражения XPath. Цель первого заключается в том, чтобы упростить понимание того, что выражается во втором выражении XPath. Оставляя только последний xsl:value-of в корпусе шаблона, получается точно желаемый результат:

12345

Ответ 5

Просто записка для моего будущего "я" (или кого-либо еще), которому будет полезно напоминание о точном синтаксисе, который работал для меня.

Объявите эту переменную

<xsl:variable name="apos" select='"&apos;"'/>

И использовать его в таком состоянии, как это

<xsl:if test="$value = concat('G-2', $apos, 'd')">89594</xsl:if>