1

我有一个 xml 文档,其部分大致如下:

<a>
  <b></b>
  <b>Previous</b>
  <b></b>
  ...
</a>
<a>
  <b></b>
  <b>Current</b>
  <b></b>
  ...
</a>
...

我的 xsl 中有以下部分:

<xsl:template match="/">
  <xsl:apply-templates select="//a"/>
</xsl:template>

<xsl:template match="//a">
  <xsl:for-each select="./b[text() != ???]">
  ...
  </xsl:for-each>
</xsl:template>

我需要???选择与当前“c”处于相同位置(在其父“a”元素内)但在前一个“a”元素中的“c”元素(示例对在 xml 源中标记为 Current 和 Previous )。

本质上,这需要将 for-each 循环的 position() 传递给它自己的 select 语句。这听起来有点不可能——因为 select 语句只评估一次。

现在可以从 for-each 循环中传递 position() 并将其保存到一个变量中,然后该变量可以在 if 语句中使用。但是,问题是我想知道最后一次迭代发生的时间。如果我使用 if 语句,那么这会破坏 last() 的含义 - 如果最后一次迭代未通过 if 测试。

4

1 回答 1

0

尝试这个:

<xsl:for-each select="/b[ text() != ../../preceding-sibling::a/b[position(.)] ]" >

previous-sibling::axis 选择当前步骤之前的节点

于 2013-09-13T14:50:38.807 回答