<xsl:variable name="hello">
<xsl:choose>
<xsl:when test="$something=true()">
<xsl:value-of select="$world" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$world" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
Я хочу обработать $hello
в <xsl:for-each select="$hello">
.С блоком выше у <xsl:for-each>
есть только один элемент для обработки, который содержит объединенное содержимое $world
.Почему это так?
Переменная с именем $hello
содержит строковое значение $world
.Это по определению, как <xsl:value-of>
ведет себя в XSLT 1.0.
Вы не показали нам, как определяется $world
, но если он содержит один элемент или целое дерево документов, то (снова)определение, его строковое значение - это объединение (в порядке документа) всех его потомков - текстовых узлов.
Это именно то, что вы видите.
Ситуация будет другойесли от :
<xsl:value-of select="$world" />
вы используете :
<xsl:copy-of select="$world" />
Это копирует все поддерево, корнем которого является элемент (или корневой узел * 1030).* в случае, когда $world
содержит полный документ), содержащийся в $world
.
Однако в XSLT 1.0 это создает так называемый RTF (Result Tree Fragment) и по определению нельзя использовать RTF какшаг местоположения в выражении XPath (1.0).
Сначала необходимо преобразовать его в обычное дерево (узел документа), используя предоставляемую поставщиком функцию расширения, которая чаще всего имеет локальное имя node-set
, но находится вспецифичное для поставщика пространство имен.
Типичным примером является :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vWorld" select="/*"/>
<xsl:template match="/">
<xsl:variable name="vrtfHello">
<xsl:copy-of select="$vWorld"/>
</xsl:variable>
<xsl:variable name="vHello" select=
"ext:node-set($vrtfHello)/*"/>
<xsl:copy-of select="$vHello/*[3]"/>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к следующему документу XML:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
результат равен (как и ожидалось):
<num>03</num>
Здесь мы используем функцию расширения ext:node-set()
в пространстве имен "http://exslt.org/common", как указано в независимой от производителя библиотеке EXSLT.Большинство процессоров XSLT 1.0 поддерживают EXSLT, и использование его функции расширения node-set()
не уменьшает степень переносимости приложения XSLT на все такие процессоры XSLT.