#xml
#xml
Вопрос:
Мне нужно написать шаблон XSLT для идентификации строки чисел. Как я могу это сделать?
Комментарии:
1. Можете ли вы опубликовать входящий XML, который вы используете?
2. Какую версию XSLT и что вы ожидаете на выходе?
3. Хороший вопрос, 1. Оператор XPath
mod
— ваш друг. Токенизация так же проста, какtokenize()
с XPath 2.0 / XSLT 2.0 или с рекурсивно вызываемым именованным шаблоном в XSLT 1.0.4. Я могу использовать 2.0 или 1.0, но входящий XML отсутствует, я использую процессор Saxon XSLT для передачи списка чисел
Ответ №1:
Чтобы разделить строку на последовательность чисел, используйте tokenize()
в XSLT 2.0 или EXSLT str:tokenize
в XSLT 1.0. Чтобы проверить, является ли число $ N четным, используйте $N mod 2 = 0
Комментарии:
1. Хороший синтаксис ‘mod’.
Ответ №2:
Решение XSLT 1.0:
<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:param name="pNumbers" select="'2,23,12,251'"/>
<xsl:template match="/">
<xsl:call-template name="classify"/>
</xsl:template>
<xsl:template name="classify">
<xsl:param name="pNums" select="$pNumbers"/>
<xsl:if test="string-length($pNums)">
<xsl:variable name="vN" select=
"substring-before(concat($pNums, ','), ',')"/>
<num odd="{$vN mod 2 = 1}">
<xsl:value-of select="$vN"/>
</num>
<xsl:call-template name="classify">
<xsl:with-param name="pNums" select=
"substring-after($pNums, ',')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к любому XML-документу (не используется), создается требуемая правильная классификация:
<num odd="false">2</num>
<num odd="true">23</num>
<num odd="false">12</num>
<num odd="true">251</num>