假设我有以下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和难以阅读的解决方案。我希望有更好的方法。
我错过了什么吗?有更好的方法吗?
答案 0 :(得分:1)
事实证明,在我写这个问题时,我所寻找的any
函数存在,只是用不同的名字:some
。从技术上讲,这不是一个函数,但它是具有特殊语法的自己的XPath表达式。
我应该可以写
/root/a[some $b in b satisfies starts-with(string($b), 'bar')]
获得我想要的结果。