XPath 2.0中是否有布尔任意函数?

时间:2018-01-25 16:53:52

标签: xpath xpath-2.0

假设我有以下XML

<root>
  <a>
    <b>hi</b>
    <b>ho</b>
  </a>
  <a>
    <b>foo</b>
    <b>barnacle</b>
    <b>baz</b>
  </a>
  <a>
    <b>bye</b>
  </a>
</root>

我想编写一个XPath 2.0表达式,该表达式与a元素匹配,该元素具有以b开头的任何bar子元素,无论b个孩子是什么是或有多少b个孩子。

我认为这看起来像

/root/a[starts-with(string(b), 'bar')]

starts-with将字符串作为输入,而不是序列。也许像

这样的东西
/root/a[any(for $b in b return starts-with(string($b), 'bar'))]

但我在XPath 2.0中找不到any函数。如果它存在,我会期望它采取一系列布尔值并返回true如果序列的任何元素是true

我可以用这样的整数来模拟any函数“伪造”布尔逻辑

/root/a[sum(for $b in b return if starts-with(string($b), 'bar') then 1 else 0) > 0]

但这是一个hacky和难以阅读的解决方案。我希望有更好的方法。

我错过了什么吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

事实证明,在我写这个问题时,我所寻找的any函数存在,只是用不同的名字:some。从技术上讲,这不是一个函数,但它是具有特殊语法的自己的XPath表达式。

我应该可以写

/root/a[some $b in b satisfies starts-with(string($b), 'bar')]

获得我想要的结果。