Как избежать одиночной кавычки в функции подстроки xslt
Я попытался подстроить данные с помощью одной кавычки в XSLT:
String : DataFromXML:'12345'
Ожидаемый Результат: 12345
<xsl:value-of select="substring-after('$datafromxml','DataFromXML:')"/>
Результат: '12345'
Я попытался под кодом
<xsl:value-of select="substring-after('$datafromxml','DataFromXML:'')"/>
<xsl:value-of select="substring-after('$datafromxml','DataFromXML:'')"/>
<xsl:value-of select="substring-after('$datafromxml','DataFromXML:'')"/>
Ошибка:
String literal was not closed 'DataFromXML:'--->'<---
Ответы
Ответ 1
Общие правила экранирования:
В 1.0:
- если вы хотите использовать разделитель атрибутов в строковом литерале, используйте XML
escape-форма
"
или '
- Если вы хотите, чтобы разделитель строк в строковом литерале, вы hosed
В 2.0:
- если вы хотите использовать разделитель атрибутов в строковом литерале, используйте XML
escape-форма
"
или '
- если вы хотите, чтобы разделитель строк был в строковом литерале, удвойте его (для
Например, "Я не могу" )
Использование переменной $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:'"), "'")'/>
В качестве альтернативы вы можете использовать функцию перевода для удаления надоедливых апострофов
<xsl:value-of select='translate
(substring-after($datafromxml,"DataFromXML:"), "'", "")'/>
Не обязательно приятнее, но это устраняет необходимость в переменной.
Ответ 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(.,"'")
'/>
==============
<xsl:value-of select=
'substring-before(
substring-after(substring-after(.,"'"), '"'),
"'"
)
'/>
</xsl:template>
</xsl:stylesheet>
Результат:
"12345' "
==============
12345
Обратите внимание. Я намеренно имею два выражения XPath. Цель первого заключается в том, чтобы упростить понимание того, что выражается во втором выражении XPath. Оставляя только последний xsl:value-of
в корпусе шаблона, получается точно желаемый результат:
12345
Ответ 5
Просто записка для моего будущего "я" (или кого-либо еще), которому будет полезно напоминание о точном синтаксисе, который работал для меня.
Объявите эту переменную
<xsl:variable name="apos" select='"'"'/>
И использовать его в таком состоянии, как это
<xsl:if test="$value = concat('G-2', $apos, 'd')">89594</xsl:if>