XPath 1.0独占或节点集表达式

时间:2014-09-26 15:45:04

标签: 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>

和有效的xpath(但效率低下):

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

为了清楚起见,我想抓住一个&#39;一个&#39;的直接子节点。以&#39; blah&#39;开头。但是,如果它不存在,我只想要当前节点。 如果&#39; blah&#39;节点确实存在,我不想要当前节点。

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

1 个答案:

答案 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 - 尝试在ab上方的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')])]