首页 文章

从XPath中选择First match

提问于
浏览
1

如果两者都存在,XPath(书店/书籍/ Headers ,书店/书籍/作者)选择 Headers ,作者

如何只选择这两者的第一个匹配而不是两者,并为文档中的所有“书”节点获取此值

(书店/书籍/ Headers |书店/书籍/作者)[1]将结果限制在第一本书中的第一个“ Headers ” . 但我需要能够从文档中的其他书籍节点获得结果

1 回答

  • 0

    我假设“第一个”你的意思是“首先是文档顺序”,而不是“首先在我的XPath表达式中引用” .

    在XPath 2.0中,你可以说

    bookstore/book/((title|author)[1])
    

    如果您只有XPath 1.0,请告诉我们,我们可以从那里开始 . 还让我们了解更广泛的环境(XSLT?XQuery?Javascript?),因为其中一些可能必须在XPath之外完成 .

    更新:我刚刚使用带有XPath 2.0的Simple Online XPath Tester对此进行了测试 . 给出以下XML输入:

    <?xml version="1.0" encoding="UTF-8"?>
    <bookstore>
    
    <book category="COOKING">
      <title lang="en">Everyday Italian</title>
      <author>Giada De Laurentiis</author>
      <year>2005</year>
      <price>30.00</price>
    </book>
    
    <book category="CHILDREN">
      <author>J K. Rowling</author>
      <year>2005</year>
      <price>29.99</price>
    </book>
    
    <book category="WEB">
      <title lang="en">XQuery Kick Start</title>
      <author>James McGovern</author>
      <author>Per Bothner</author>
      <author>Kurt Cagle</author>
      <author>James Linn</author>
      <author>Vaidyanathan Nagarajan</author>
      <year>2003</year>
      <price>49.99</price>
    </book>
    
    <book category="WEB">
      <title lang="en">Learning XML</title>
      <author>Erik T. Ray</author>
      <year>2003</year>
      <price>39.95</price>
    </book>
    
    </bookstore>
    

    和XPath表达式

    /bookstore/book/((title|author)[1])
    

    我得到以下输出,这似乎是你要求的:

    <title lang="en">Everyday Italian</title>
      <author>J K. Rowling</author>
      <title lang="en">XQuery Kick Start</title>
      <title lang="en">Learning XML</title>
    

    对于XPath 1.0

    如果您没有XPath 2.0,我怀疑您没有,并且您仍然希望在XPath中完成所有操作,这就是我要做的:

    /bookstore/book/title[1] | /bookstore/book[not(title)]/author[1]
    

    这是做什么的?它给出了具有 Headers 的每本书的(第一) Headers ,以及每本书没有 Headers 的(第一)作者 .

    这个表达式并不像你要求的那样通用:它假设 <title><author> 之前存在,就像它在你的样本数据中那样 . 如果您的数据在 Headers 之前有作者,那么尽管订单,上述表达仍然会更喜欢 Headers .

    如果你真的需要两个中的第一个,无论是作者还是 Headers ,试试吧

    /bookstore/book/title[1][not(preceding-sibling::author)] |
      /bookstore/book/author[1][not(preceding-sibling::title)]
    

相关问题