如何用XPath获取某个条件对应的TOP N元素

发布于 2024-11-05 10:09:34 字数 566 浏览 1 评论 0原文

我有一个像这样的 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 个节点似乎毫无用处。

谢谢

I have an XML like this

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

I'd like with one xpath (I'm in a c# context not an xslt template) get the 2 first element with a value of 4 ie

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

with /root/el[position() <= 2 and @value=4] I'd get 0 element because position() is based on the parent node, not the current subset.

I can do this in c# but it seems useless to load 1200 node when I only need 20.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

通知家属抬走 2024-11-12 10:09:34

以下内容在 XSLT 脚本中适用于我;

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

结果是 id 3 和 4,因此 XPATH /root/el[@value=4][position()<=2] 应该适合您。

The following works for me in an XSLT script;

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

The result is id's 3 and 4, so the XPATH /root/el[@value=4][position()<=2] should work for you.

梦在深巷 2024-11-12 10:09:34

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

您的表达式:

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

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

您想要:

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

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

The answer by @rsp is correct, but I'd like to add an explanation. It's not always true that [cond1 and cond2] is equivalent to [cond1][cond2]. You need the second form.

Your expression:

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

...selects all el elements that have a value attribute equal to 4 and whose position is less than or equal to 2. There are no such elements in your document.

You want:

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

...which first selects all el elements that have a value attribute equal to 4 and then filters that list by position, as desired.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文