xpath - 如何将 not contains 与属性和元素一起使用

标签 xpath xquery contains exists

<newproducts>
        <number id ="1">
        <number id ="2">
        <number id ="3">
        <number id ="4">
        <number id ="5">
</newproducts>    
<products>   
        <number>2</number>
        <number>3</number>
        <number>4</number>
</products>

number id 包含 2, 3, 4 所以输出应该是这样的

<number>1</number>
<number>5</number>

因为1和5不在数字id中所以我想输出它们

为什么这不起作用?

for $z in /newproducts/number[@id/string() != /products/number/text()]
return 
<number>{$z}</number>

这可以通过 contains 函数或exists 甚至 if then else 实现吗?

最佳答案

!= 运算符实际上是“序列中是否至少有一项是不同的”。如果您需要有效地检查“序列中是否没有相同的项目”,请使用:

not(@id/string = /products/number/text())

而不是

@id/string() != /products/number/text()

尝试按如下方式重新处理(我用根节点包装了您的输入,并在此过程中更正了一些拼写错误):

let $list :=
    <list>
    <newproducts>
            <number id ="1"/>
            <number id ="2"/>
            <number id ="3"/>
            <number id ="4"/>
            <number id ="5"/>
    </newproducts>    
    <products>   
            <number>2</number>
            <number>3</number>
            <number>4</number>
    </products>
    </list>
return
for $z in $list/newproducts/number[not(@id/string() = $list/products/number/text())]
return <number>{$z}</number> 

返回:

<number>
  <number id="1"/>
</number>
<number>
  <number id="5"/>
</number>

但是您的预期输出没有包含在数字中的数字,因此请更改您的 return 子句

<number>{$z}</number>  

类似:

<number>{$z/@id/string()}</number>  

例如:

...
for $z in $list/newproducts/number[not(@id/string() = $list/products/number/text())]
return <number>{$z/@id/string()}</number>  

返回

<number>1</number>
<number>5</number>

关于xpath - 如何将 not contains 与属性和元素一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67552146/

相关文章:

xml - XSLT - 剪切和粘贴

html - 如何使用scrapy访问下表的所有特定数据?

sql-server - OPENXML 未返回预期结果

sql-server - 使用 XQuery 仅查找并替换 xml 值的一部分?

sql - 选择包含字符串的列

c#包含多个单词不在一起

xpath - 如何使用 SXD-XPath 遍历节点集并打印出每个值?

xml - 如何在R中将xpath用于多个xml属性

sql server 从 XML 列获取特定数据

c# - collections.Contains(T) 方法