XSLT - 通过不一致的结构迭代

时间:2013-06-19 17:12:12

标签: xml xslt

如果我们有以下XML结构:

<Tree>
  <Apple>
    <Size>6</Size>
  </Apple>
  <Apple>
    <Size>4</Size>
  </Apple>
  <Apple>
    <Size>3</Size>
  </Apple>
</Tree>

通过以下方式显示下一个苹果的大小非常容易:

<xsl:for-each select="Tree/Apple">
  <xsl:value-of select="following-sibling::*/Size">
</xsl:for-each>

但是,如果你的树结构稍微复杂一些,分支可以容纳一个或多个苹果:

<Tree>
  <Branch>
    <Apple>
      <Size>6</Size>
    </Apple>
  </Branch>
  <Branch>
    <Apple>
      <Size>4</Size>
    </Apple>
    <Apple>
      <Size>3</Size>
    </Apple>
  </Branch>
</Tree>

我们如何确保始终选择下一个在线苹果? (6-4-3)

我知道你可以通过检查分支是否有更多苹果子项使用条件,然后从下一个分支中选择(如果不是这种情况)来实现这一点。但只有一个选择线的值才能实现这个目标吗?

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

您可以使用following轴,如果您使用以下内容,它会在文档后面的任何位置查找下一个Apple:

<xsl:for-each select="Tree//Apple">
  <xsl:value-of select="following::Apple[1]/Size">
</xsl:for-each>

答案 1 :(得分:1)

一般来说,“迭代不一致结构”的方式是使用xsl:apply-templates和模板规则 - 这就是这些结构的设计目的。

但至于你的苹果例子,它取决于你想要的输出。

答案 2 :(得分:0)

您也可以尝试以下内容:

<xsl:template match="Apple">
    <xsl:copy-of select=
        "(following-sibling::Apple | ../following-sibling::*/Apple )[1]/Size"/>
</xsl:template>

如果XML变得更加复杂,这可能会更加可靠。 这只会匹配“Apple在同一级别,但可以属于不同的父母。