【问题标题】:XSLT: Testing position against concurrent criteria within xsl:for-eachXSLT:根据 xsl:for-each 中的并发标准测试位置
【发布时间】:2013-12-13 18:09:21
【问题描述】:

考虑以下两个使用 XPath 表达式测试节点位置的 xsl:value-of 语句。

(1) 据我了解,这将返回 /Parent 的 /ChildThree 子项的值,其中三件事独立于该 /Parent - (i) 它有一个 /ChildOne 的值为 "x ";并且 (ii) 它有一个值为“y”的 /ChildTwo;并且 (iii) 它是其直系祖先中的第二个或后续 /Parent:

<xsl:value-of select="Parent[ChildOne='x'][ChildTwo='y'][position()&gt;=2]/ChildThree"/>

(2) 相比之下,这个将返回 /Parent 的 /ChildThree 孩子的值,其中 /Parent 是第二个或后续 /Parent 的那些同时具有值​​“x”的 /ChildOne 和值为“y”的 /ChildTwo:

<xsl:value-of select="(Parent[ChildOne='x'][ChildTwo='y'])[position()&gt;=2]/ChildThree"/>

到目前为止一切顺利。但是,在下面的示例中会发生什么?在这里,我试图获取前两个条件同时为真的任何 /Parent 的 /ChildThree 子项的值,但如果 /Parent 是该子集中的第二个或后续(即,如上面的示例(2))。当 xsl:for-if 语句中的条件不是同一个 XPath 表达式的一部分时,我如何指定 xsl:if 语句中的位置条件如何应用于该条件?

<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:for-each>

【问题讨论】:

  • 查看您所指的 XML 文档将非常有助于理解您的问题,恕我直言。

标签: xslt xpath


【解决方案1】:

这两个语句(1)和(2)实际上是等价的,并且会返回相同的结果。

position() 是上下文相关的。它将为您提供当前节点在先前选择的节点集中的位置。因此,当您拥有表达式 Parent[ChildOne='x'][ChildTwo='y'] 时,它会返回一组节点,其中两个条件为真。执行Parent[ChildOne='x'][ChildTwo='y'][position()&amp;gt;=2] 将给出此列表中的第二个(或更大)节点。

您所描述的您认为 (1) 的工作方式实际上是这样的。

<xsl:value-of select="Parent[position()&gt;=2][ChildOne='x'][ChildTwo='y']/ChildThree"/>

一种思考方式是考虑方括号中的每个条件,过滤之前发生的事情。

在这个 XML 上试一试,例如

<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>

您的语句 (1) 和 (2) 都返回 z2,但执行 Parent[position()&amp;gt;=2][ChildOne='x'][ChildTwo='y']/ChildThree 会返回 z1

这意味着您的 xsl:for-each 实际上应该给您预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多