gpt4 book ai didi

XPath 1.0 独占或节点集表达式

转载 作者:行者123 更新时间:2023-12-03 15:25:07 25 4
gpt4 key购买 nike

我需要的似乎与其他类似标题的文章不太匹配。

我需要使用 Xpath 1 才能按顺序获得节点 a 或节点 b。
即如果存在则为节点a,否则为节点b。

一个 xpath 表达式,例如:
expression | expression
如果它们都存在,我将得到它们。那不是我想要的。

我可以去:
(expression | expression)[last()]
这实际上让我得到了我需要的东西(在我的情况下),但似乎有点低效,因为它会在选择最后一个结果之前评估表达式的两边。
我希望有一个表达式,一旦左侧成功,它就会停止工作。

一个更具体的 XML 示例

<one>
<two>
<three>hello</three>
<four>bye</four>
</two>
<blahfive>again</blahfive>
</one>

和有效的xpath(但效率低下):
(/one/*[starts-with(local-name(.), 'blah')] | .)[last()]
明确地说,我想获取以“blah”开头的“one”的直接子节点。但是,如果它不存在,我只想要当前节点。
如果 'blah' 节点确实存在,我不想要当前节点。

有没有更有效的方法来实现这一目标?

最佳答案

I need, using Xpath 1, to be able to get node a, or node b, excusively, in that order. That is, node a if it exists, otherwise, node b.

an xpath expression such as :

expression | expression

will get me both in the case they both exist. that is not what I want.

I could go:

(expression | expression)[last()]

Which does in fact gget me what I need (in my case),



这种说法不正确 .

这是一个例子。让我们有这个 XML 文档:
<one>
<a/>
<b/>
</one>

表达式 1 是:
/*/a

表达式 2 是:
/*/b

您的复合表达式:
(Expression1 | Expression2)[last()]

当我们替换上面的两个表达式是:
(/*/a | /*/b)[last()]

而这个表达式实际上选择了 b -- 不是 a -- 因为 b按文档顺序是两者中的最后一个。

现在,这是一个仅选择 a 的表达式如果存在,并选择 b仅当 a不存在——无论文档顺序如何:
/*/a | /*/b[not(/*/a)]

当在上面的 XML 文档上计算这个表达式时,它选择 a , 无论其文档顺序如何——尝试在 a 位置上方交换 XML 文档和 b确认在这两种情况下选择的元素都是 a .

总而言之,一个选择所需节点的表达式 无论任何文件顺序是:
Expression1 | Expression2[not(Expression1)]

让我们在您的案例中应用这个通用表达式:

表达式 1 是:
/one/*[starts-with(local-name(.), 'blah')] 

表达式 2 是:
self::node()

想要的表达式(将上述通用表达式中的 Expression1 和 Expression2 代入后)为:
   /one/*[starts-with(local-name(.), 'blah')] 
|
self::node()[not(/one/*[starts-with(local-name(.), 'blah')])]

关于XPath 1.0 独占或节点集表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26063396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com