对于下面的示例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"/>

10-04 20:11