对于下面的示例XML,我需要检查所有/ bookstore / book / price是否都以“USD”结尾。
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00USD</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99USD</price>
</book>
</bookstore>
我为此使用的逻辑是
if(fn:substring(/bookstore/book//Salary/text(), fn:string-length(/bookstore/book//Salary/text())-2 ) = 'USD') then 'true' else 'false'
但是失败,并显示为“原因:net.sf.saxon.trans.XPathException:不允许将一个以上项目作为fn:substring()的第一个参数”。
是的,该解析器是正确的,因为fn:substring()仅接受一个原子值,但我仍然坚持如何实现此方案。
请任何人能阐明实现此逻辑的逻辑还是XPath中的任何函数/运算符?
只是让您知道,Linux上运行的My Java代码支持XPath 2.0。
谢谢
最佳答案
两种方法:都可能比使用必须遍历整个序列的count()
更有效的(如果中途违反条件):
not(/bookstore/book/price[not(ends-with(., 'USD'))])
和:
every $p in /bookstore/book/price
satisfies ends-with($p, 'USD')
后者可以更紧凑地写为:
every $b in bookstore/book/price/ends-with(., 'USD')
satisfies $b"/>