gpt4 book ai didi

xml - Xpath 选择包含特定列表子集的元素

转载 作者:数据小太阳 更新时间:2023-10-29 02:24:51 24 4
gpt4 key购买 nike

美好的一天!假设以下 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]
但它会选择包含至少 1 本普通书籍的商店,而不是全部。
此外,没有为两个节点列表找到任何像“包含”这样的谓词,所以我缺乏想法。

编辑:我非常感谢任何帮助,但我更喜欢使用“基本”Xpath 功能(如果存在)的解决方案。对我来说这是一门新语言。然而,感谢到目前为止所有回复的人。

最佳答案

使用:

/*/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)])]

意思是:

选择所有 store 元素(顶级元素的子元素),这样它们中甚至没有一个 book(子元素)的 id 属性值是 booklistbook(子级)的 id 属性值之一。

关于xml - Xpath 选择包含特定列表子集的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6465457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com