【问题标题】:Selecting the following sibling of a sorted node选择已排序节点的以下同级
【发布时间】:2016-07-22 00:25:02
【问题描述】:

当节点已在 XSLT 1.0 中排序时,尝试解决如何选择 XSLT 节点的下同兄弟节点。我已经搜索但找不到任何排序节点,因为它只选择 unsorted 节点的兄弟节点。

数据

<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

【问题讨论】:

  • 可以尝试在测试中使用 number(position()) mod 2 = 1。因为 position() 将返回一个字符串。我不确定它是否会起作用,只是试一试

标签: xslt xpath


【解决方案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>

【讨论】:

  • 谢谢。我遇到的实际问题并没有被这里的解决方案解决,但你确实回答了我关于我正在尝试的事情是否可行的问题。我将此标记为已接受的答案,因为它回答了我问得最好的问题。
【解决方案2】:

它只选择未排序节点的兄弟。

没错。你为什么不简单地做:

<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"/>

【讨论】:

  • 这适用于我的简化示例,但我尝试使用此代码的实际位置是一个 html 表格,它不适用于拆分表格行标签。那么在 XSLT 1.0 中是否根本不可能获得已排序节点的兄弟节点?
  • 如果你真的需要它们成为兄弟姐妹,你必须首先将它们复制(或以其他方式将它们重新创建为新节点)到一个变量中。在 XSLT 1.0 中,您还需要将该变量转换为节点集,然后才能进一步处理它。
猜你喜欢
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
相关资源
最近更新 更多