Можно применить два или более преобразований в последовательности (цепочке), каждое из которых работает с результатом предыдущего.
Вот как объединить два преобразования в XSLT 2.0 (пример XSLT 1.0 аналогичен, но необходимо использовать функцию xxx:node-set()
для каждого промежуточного результата):
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vPass1">
<xsl:apply-templates select="/*"/>
</xsl:variable>
<xsl:template match="node()|@*" name="id" mode="#default pass2">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="$vPass1" mode="pass2"/>
</xsl:template>
<xsl:template match="num/text()">
<xsl:value-of select="2*."/>
</xsl:template>
<xsl:template match="num/text()" mode="pass2">
<xsl:value-of select="1+."/>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к следующему документу XML:
<nums>
<num>1</num>
<num>2</num>
<num>3</num>
<num>4</num>
<num>5</num>
</nums>
два преобразования применяются в последовательности.Результатом первого преобразования является новый XML-документ, в котором значение каждого узла num/text()
равно удвоенному значению исходного узла num/text()
.Второе преобразование применяется к этому промежуточному результату, и его действие заключается в добавлении 1
к каждому num/text()
узлу и получении этого результата в качестве нового соответствующего узла `num / text () '.
Таким образом, результатом вычисления является то, что каждый $n
(значение каждого num/text()
узла) преобразуется в 2*$n+1
:
<nums>
<num>3</num>
<num>5</num>
<num>7</num>
<num>9</num>
<num>11</num>
</nums>