我需要的东西似乎与其他类似名称的文章相匹配。
我需要使用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()]
为了清楚起见,我想抓住一个&#39;一个&#39;的直接子节点。以&#39; blah&#39;开头。但是,如果它不存在,我只想要当前节点。 如果&#39; blah&#39;节点确实存在,我不想要当前节点。
有没有更有效的方法来实现这一目标?
答案 0 :(得分:1)
我需要使用Xpath 1来获取节点a或节点b, 依旧,按顺序。也就是说,节点a是否存在,否则, 节点b。
xpath表达式,例如:
在他们俩都存在的情况下,
expression | expression
会得到我。这不是我想要的。
我可以去:
(expression | expression)[last()]
实际上,我确实需要我(在我的情况下),
此声明不正确。
这是一个例子。让我们拥有这个XML文档:
<one>
<a/>
<b/>
</one>
Expression1 :
/*/a
Expression2 :
/*/b
您的复合表达:
(Expression1 | Expression2)[last()]
当我们替换上面的两个表达式时是:
(/*/a | /*/b)[last()]
此表达式实际上选择了b
- 而不是a
- 因为b
是文档顺序中的最后一个。
现在,这是一个只选择a
表达式的表达式,只有当b
不存在时才选择a
- 无论文档顺序如何:
/*/a | /*/b[not(/*/a)]
在上面的XML文档中评估此表达式时,无论文档顺序如何,都会选择a
- 尝试在a
和b
上方的XML文档中进行交换确认在两种情况下选择的元素都是a
。
总结一下,无论文档顺序如何,选择所需节点的一个表达式是:
Expression1 | Expression2[not(Expression1)]
让我们在你的案例中应用这个一般表达式:
Expression1 :
/one/*[starts-with(local-name(.), 'blah')]
Expression2 :
self::node()
想要的表达式(在上面的通用表达式中替换Expression1和Expression2之后)是:
/one/*[starts-with(local-name(.), 'blah')]
|
self::node()[not(/one/*[starts-with(local-name(.), 'blah')])]