2

我有一个这样的 XML

<root>
<el id="1" value="3"/>
<el id="2" value="3"/>
<el id="3" value="4"/>
<el id="4" value="4"/>
<el id="5" value="4"/>
<el id="6" value="4"/>
</root>

我想用一个 xpath(我在 ac# 上下文而不是 xslt 模板中)获得值为 4 的 2 第一个元素,即

<el id="3" value="4"/>
<el id="4" value="4"/>

我会得到/root/el[position() <= 2 and @value=4] 0 元素,因为 position() 基于父节点,而不是当前子集。

我可以在 c# 中做到这一点,但是当我只需要 20 个节点时加载 1200 个节点似乎没用。

谢谢

4

2 回答 2

4

以下在 XSLT 脚本中对我有用;

  <xsl:template match="/">
    <xsl:apply-templates select="/root/el[@value=4][position()&lt;=2]" />
  </xsl:template>

结果是 id 的 3 和 4,所以 XPATH/root/el[@value=4][position()&lt;=2]应该适合你。

于 2011-05-05T15:09:22.917 回答
2

@rsp 的答案是正确的,但我想添加一个解释。并不总是[cond1 and cond2]等价于[cond1][cond2]. 你需要第二种形式。

你的表情:

/root/el[position() <= 2 and @value=4]

...选择属性等于且位置小于或等于的所有el元素。您的文档中没有此类元素。value42

你要:

/root/el[@value=4][position() <= 2]

...它首先选择属性等于el的所有元素,然后根据需要按位置过滤该列表。value4

于 2011-05-05T15:20:46.073 回答