尝试在XSLT 1.0中对节点进行排序时,了解如何选择XSLT节点的以下兄弟节点。我已搜索但找不到排序节点的任何内容,因为它只选择未排序节点的兄弟。
数据
<data>
<number order='4'>Four</number>
<number order='1'>One</number>
<number order='3'>Three</number>
<number order='2'>Two</number>
</data>
代码
<xsl:for-each select="/data/number">
<xsl:sort select="@order"/>
<xsl:if test="position() mod 2 = 1">
<xsl:value-of select="text()"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="following-sibling::*/text()"/>
</xsl:if>
</xsl:for-each>
预期输出
One - Two
Three - Four
实际输出
One - Three
Three - Two
答案 0 :(得分:1)
它只选择未排序节点的兄弟。
这是正确的。为什么你不做:
<xsl:for-each select="/data/number">
<xsl:sort select="@order"/>
<xsl:value-of select="."/>
<xsl:choose>
<xsl:when test="position() mod 2 = 1">
<xsl:text>-</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
请注意,默认排序数据类型为text
;你可能想成功:
<xsl:sort select="@order" data-type="number"/>
答案 1 :(得分:1)
对一系列节点进行排序时,会在新序列中获得相同的节点。因为它们是相同的节点,所以它们具有与它们一直相同的兄弟节点。如果将节点复制到结果树,则副本将具有新的兄弟节点,但这是因为将它们写入结果树的操作,而不是因为排序操作。
另一种方法是:处理一系列不是兄弟节点的节点,因此不能使用follow-sibling来获取序列中的下一个节点。
在XSLT 2.0中处理排序的节点序列变得更加容易,它允许将这样的序列绑定到变量。 XSLT 1.0只有节点集,因此特定顺序的节点序列只能暂时存在。
但在这种特殊情况下,做起来似乎很容易
<xsl:value-of select="."/>
<xsl:if test="position() mod 2 = 1">
<xsl:text> - </xsl:text>
</xsl:if>