如果两者都存在,XPath(书店/书籍/ Headers ,书店/书籍/作者)选择 Headers ,作者
如何只选择这两者的第一个匹配而不是两者,并为文档中的所有“书”节点获取此值
(书店/书籍/ Headers |书店/书籍/作者)[1]将结果限制在第一本书中的第一个“ Headers ” . 但我需要能够从文档中的其他书籍节点获得结果
我假设“第一个”你的意思是“首先是文档顺序”,而不是“首先在我的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 2.0,我怀疑您没有,并且您仍然希望在XPath中完成所有操作,这就是我要做的:
/bookstore/book/title[1] | /bookstore/book[not(title)]/author[1]
这是做什么的?它给出了具有 Headers 的每本书的(第一) Headers ,以及每本书没有 Headers 的(第一)作者 .
这个表达式并不像你要求的那样通用:它假设 <title> 在 <author> 之前存在,就像它在你的样本数据中那样 . 如果您的数据在 Headers 之前有作者,那么尽管订单,上述表达仍然会更喜欢 Headers .
<title>
<author>
如果你真的需要两个中的第一个,无论是作者还是 Headers ,试试吧
/bookstore/book/title[1][not(preceding-sibling::author)] | /bookstore/book/author[1][not(preceding-sibling::title)]
1 回答
我假设“第一个”你的意思是“首先是文档顺序”,而不是“首先在我的XPath表达式中引用” .
在XPath 2.0中,你可以说
如果您只有XPath 1.0,请告诉我们,我们可以从那里开始 . 还让我们了解更广泛的环境(XSLT?XQuery?Javascript?),因为其中一些可能必须在XPath之外完成 .
更新:我刚刚使用带有XPath 2.0的Simple Online XPath Tester对此进行了测试 . 给出以下XML输入:
和XPath表达式
我得到以下输出,这似乎是你要求的:
对于XPath 1.0
如果您没有XPath 2.0,我怀疑您没有,并且您仍然希望在XPath中完成所有操作,这就是我要做的:
这是做什么的?它给出了具有 Headers 的每本书的(第一) Headers ,以及每本书没有 Headers 的(第一)作者 .
这个表达式并不像你要求的那样通用:它假设
<title>
在<author>
之前存在,就像它在你的样本数据中那样 . 如果您的数据在 Headers 之前有作者,那么尽管订单,上述表达仍然会更喜欢 Headers .如果你真的需要两个中的第一个,无论是作者还是 Headers ,试试吧