XSLT:引用超出当前xsl:for-each使用位置()的节点集

时间:2013-12-14 12:56:42

标签: xslt xpath

比较这两个XML提取:

(1)

<Parents>
   <Parent>
      <ChildOne>a</ChildOne>
      <ChildTwo>b</ChildTwo>
      <ChildThree>c</ChildThree>
   </Parent>
   <Parent>
      <ChildOne>x</ChildOne>
      <ChildTwo>y</ChildTwo>
      <ChildThree>z1</ChildThree>
   </Parent>
   <Parent>
      <ChildOne>x</ChildOne>
      <ChildTwo>y</ChildTwo>
      <ChildThree>z2</ChildThree>
   </Parent>
</Parents>

(2)

<Parents>
   <Parent>
      <ChildOne>x</ChildOne>
      <ChildTwo>y</ChildTwo>
      <ChildThree>z1</ChildThree>
   </Parent>
   <Parent>
      <ChildOne>x</ChildOne>
      <ChildTwo>y</ChildTwo>
      <ChildThree>z2</ChildThree>
   </Parent>
</Parents>

假设我想为/ Parent的所有实例找到/ ChildThree的值,其中/ ChildOne的值为“x”,而/ ChildTwo的值为“y”,但如果第一个这样的实例,则添加某种额外的标记也是/ Parent

的所有实例中的第一个

所以,对于上面的(1),我想要这个输出:

z1 z2

对于上面的(2),我想要这个输出:

z1这是第一个家长。 Z2

为实现这一目标,如果我使用xsl:for-each,如下所示:

<xsl:for-each select="Parent[ChildOne='x'][ChildTwo='y']">
   <xsl:if test="position()&gt;=2">
      <xsl:text>&#x20;</xsl:text>
   </xsl:if>
   <xsl:value-of select="ChildThree"/>
   <xsl:if test="ExpressionHere">
      <xsl:text>&#x20;This&#x20;is&#x20;the&#x20;first&#x20;Parent.</xsl:text>
   </xsl:if>
</xsl:for-each>

...我需要什么XPath表达式,表达“ExpressionHere”?

1 个答案:

答案 0 :(得分:0)

您可以在此处使用前兄弟轴来测试您当前的 Parent 元素是否包含任何兄弟姐妹。

<xsl:if test="not(preceding-sibling::Parent)">
   <xsl:text>This is the first Parent.</xsl:text>
</xsl:if>

或者,如果您确实需要找到 Parent 元素的位置,无论ChildOne和ChildTwo条件如何,您都可以使用 xsl:number 命令,虽然你需要把它放在一个变量中来引用它

<xsl:variable name="position">
   <xsl:number />
</xsl:variable>
<xsl:if test="$position = 1">
   <xsl:text>This is the first Parent.</xsl:text>
</xsl:if>