再会!假设以下 XML:
<store>
<book id="b1"></book>
<book id="b2"></book>
</store>
<store>
<book id="b2"></book>
<book id="b4"></book>
</store>
<booklist>
<book id="b1"></book>
<book id="b2"></book>
<book id="b3"></book>
</booklist>
我想编写一个 Xpath 查询来选择商店
他们所有的书都在书单里。在我的示例中,它是第一家商店,但不是第二家。
我试过了
//store[./book/@id = /booklist/book/@id]
但它选择包含至少一本普通书的商店,而不是全部。
另外,没有找到任何像两个节点列表的“包含”这样的谓词,所以我缺乏想法。
编辑:我非常感谢任何帮助,但我更喜欢一个使用“基本”Xpath 功能(如果存在)的解决方案。这对我来说是一门新语言。不过,还是要感谢迄今为止所有回复的人。
Use:
/*/store[not(book[not(@id = /*/booklist/*/@id)])]
当应用于此 XML 文档时(所提供的,通过用单个顶部元素包裹它而形成良好的形式):
<t>
<store>
<book id="b1"></book>
<book id="b2"></book>
</store>
<store>
<book id="b2"></book>
<book id="b4"></book>
</store>
<booklist>
<book id="b1"></book>
<book id="b2"></book>
<book id="b3"></book>
</booklist>
</t>
通缉犯stor
元素被选中:
<store>
<book id="b1"/>
<book id="b2"/>
</store>
使用XSLT作为XPath的宿主进行验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/store[not(book[not(@id = /*/booklist/*/@id)])]"/>
</xsl:template>
</xsl:stylesheet>
当此 XSLT 转换应用于上述 XML 文档时,就会产生所需的正确结果:
<store>
<book id="b1"/>
<book id="b2"/>
</store>
解释:
表达方式:
/*/store[not(book[not(@id = /*/booklist/*/@id)])]
means:
全选store
元素(顶部元素的子元素),甚至没有一个book
(孩子)在他们的id
属性的值是其中之一id
的属性值book
的(孩子)booklist
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)