XPath 1.0独占或节点集表达式

sva*_*ens 8 xpath

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

我需要,使用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>
Run Code Online (Sandbox Code Playgroud)

和工作的xpath(但效率低下):

(/one/*[starts-with(local-name(.), 'blah')] | .)[last()]

为了清楚起见,我想抓住以'blah'开头的'one'的直接子节点.但是,如果它不存在,我只想要当前节点.如果'blah'节点确实存在,我不想要当前节点.

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

Dim*_*hev 1

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

xpath 表达式,例如:

expression | expression

如果它们都存在的话,我会得到它们。那不是我想要的。

我可以去:

(expression | expression)[last()]

这实际上让我得到了我需要的东西(就我而言),

这种说法是不正确的

这是一个例子。让我们有这个 XML 文档:

<one>
  <a/>
  <b/>
</one>
Run Code Online (Sandbox Code Playgroud)

表达式1是

/*/a
Run Code Online (Sandbox Code Playgroud)

表达式2是

/*/b
Run Code Online (Sandbox Code Playgroud)

你的复合表达式

(Expression1 | Expression2)[last()]
Run Code Online (Sandbox Code Playgroud)

当我们替换上面的两个表达式时:

(/*/a | /*/b)[last()]
Run Code Online (Sandbox Code Playgroud)

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

现在,这里有一个表达式,a如果存在则选择它,b如果a不存在则选择 - 无论文档顺序如何:

/*/a | /*/b[not(/*/a)]
Run Code Online (Sandbox Code Playgroud)

当在上面的 XML 文档上计算此表达式时,它会选择,而不管其文档顺序如何 - 尝试在上面的 XML 文档中交换和a的位置,以确认在这两种情况下选择的元素都是。aba

总而言之,无论任何文档顺序如何,选择所需节点的一个表达式是:

Expression1 | Expression2[not(Expression1)]
Run Code Online (Sandbox Code Playgroud)

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

表达式1是

/one/*[starts-with(local-name(.), 'blah')] 
Run Code Online (Sandbox Code Playgroud)

表达式2是

self::node()
Run Code Online (Sandbox Code Playgroud)

想要的表达式(替换上述通用表达式中的Expression1和Expression2后)为:

   /one/*[starts-with(local-name(.), 'blah')] 
|  
   self::node()[not(/one/*[starts-with(local-name(.), 'blah')])]
Run Code Online (Sandbox Code Playgroud)