Использование заканчивается в XSLT v1.0
Я пытаюсь отредактировать текущий XSLT. Функциональность, которую я хочу, - это когда значение "//code_no" заканчивается 01. Я хочу отредактировать текущее местоположение города. В настоящее время этой функции не существует.
Я пробовал использовать строку и подстроку, но это дает мне ошибку, говорящий, что концы с функциональностью не существуют. Пожалуйста, помогите
Значение, исходящее из xml, равно
<code_no>
1870410001
</code_no>
в xsl, я хочу напечатать это, когда значение заканчивается на 01.
<td align="left" width="33%"><SPAN style="font-size: 12pt; font-family: Arial;">
<a> <b><u><xsl:value-of select="//city"/>, <xsl:value-of select="//state"/>
</u></b></a></SPAN></td>
Ответы
Ответ 1
эквивалент XPath 1.0 (выражение XPath 2.0):
ends-with($s, $t)
является
$t = substring($s, string-length($s) - string-length($t) +1)
Вам нужно просто подставить $s
и $t
в последнем выражении XPath с, соответственно, проверяемой строкой и завершающим окончанием.
Вот полный пример:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="x|y">
<xsl:value-of select="name()"/> ends-with '_01': <xsl:value-of select=
"'_01' = substring(., string-length() - 2)"/>
=============
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к следующему XML-документу (в вопросе!!!):
<t>
<x>abcd_01</x>
<y>abcd_11</y>
</t>
выдается желаемый, правильный результат:
x ends-with '_01': true
=============
y ends-with '_01': false
=============
Ответ 2
XSLT 1.0 использует XPath 1.0, который не включает никакой функции с именем ends-with
. Вы можете подделать его, используя технику, найденную здесь:
Ответ 3
Я использовал
contains($string, $part) and normalize-space(substring-after($string, $part)) = ''
Где
мы проверяем, заканчивается ли $string с помощью $part
Ответ 4
Не совсем кончается, но лучше выглядит, чем подстрочное решение, и по-прежнему подходит для определенных ситуаций:
<xsl:template match="*[contains(name(), 'substr')]"/>
Ответ 5
В особых случаях, если вы знаете, что какой-то символ не может содержаться в теге, например, § вы можете сделать это:
<xsl:if test="contains(concat(code_no,'§'),'01§')">
<td align="left" width="33%"><SPAN style="font-size: 12pt; font-family: Arial;">
<a> <b><u><xsl:value-of select="//city"/>, <xsl:value-of select="//state"/>
</u></b></a></SPAN></td>
</xsl:if>