选择已排序节点的以下兄弟节点

时间:2016-07-22 00:25:03

标签: xslt xpath

尝试在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

2 个答案:

答案 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>&#10;</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>