0

如果我们有以下 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)

我知道您可以通过使用条件检查分支是否有更多的苹果子节点来实现这一点,如果不是,则从下一个分支中进行选择。但是是否有可能只用一个 value-of 选择行来实现这一点?

非常感谢您的帮助。

4

3 回答 3

2

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

<xsl:for-each select="Tree//Apple">
  <xsl:value-of select="following::Apple[1]/Size">
</xsl:for-each>
于 2013-06-19T17:18:41.123 回答
1

通常,您“遍历不一致的结构”的方式是使用 xsl:apply-templates 和模板规则——这就是这些结构的设计目的。

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

于 2013-06-19T18:58:19.227 回答
0

您也可以尝试以下方法:

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

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

于 2013-06-19T17:41:13.097 回答