如何在同一位置选择以前的堂兄?

时间:2013-09-13 09:58:12

标签: xpath xslt-1.0

我有一个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测试。

1 个答案:

答案 0 :(得分:0)

试试这个:

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

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