【问题标题】:For loop in XPath?XPath 中的 For 循环?
【发布时间】:2015-02-26 07:27:09
【问题描述】:

对于下面的示例 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 上运行的 java 代码支持 XPath 2.0。

谢谢

【问题讨论】:

  • count() 通常不如具有自然快捷方式的表达式效率。请参阅我的答案中的详细信息。

标签: java regex xpath xpath-2.0


【解决方案1】:

我已经用一个 XSL 程序对此进行了测试,在模板中使用了一个匹配“/”的选择:

count(//price[not(ends-with(.,'USD'))])

在您的 XML 上返回 0。

【讨论】:

    【解决方案2】:

    两种方法两者都可能更有效(如果在中途违反条件)比使用必须遍历整个序列的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"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多