Xml 如何在XPath中进行负联接(“除”)呢?
我有以下XML:Xml 如何在XPath中进行负联接(“除”)呢?,xml,xpath,Xml,Xpath,我有以下XML: <Products xmlns="urn:shop.fruit"> <!-- documento XML para a pergunta 5 --> <Stock> <product name="banana" quant="2000" un="kg"/> <product name="aple" quant="3000" un="kg"/> <product name="oran
<Products xmlns="urn:shop.fruit">
<!-- documento XML para a pergunta 5 -->
<Stock>
<product name="banana" quant="2000" un="kg"/>
<product name="aple" quant="3000" un="kg"/>
<product name="orange" quant="3500" un="kg"/>
<product name="melon" quant="1000" un="kg"/>
</Stock>
<Prices>
<product name="aple" un="€">1.2</produto>
<product name="melon" un="€">1.5</produto>
</Prices>
</Products >
1.2
1.5
我需要XPath,该XPath为我提供股票标签中所有产品的名称,价格标签中的产品除外。
我想要的结果是:name=“banana”;name=“橙色”。
我尝试过这个XPath:/Produtos/Stock/produto/@nome,除了/Produtos/Preços/produto/@nome
但似乎不接受except运算符。
有什么建议吗?只有在XPath 2.0中才提供
except
操作符,但是您可以在XPath 1.0(和XPath 2.0)中实现您想要的功能,而无需except
首先,在计算XPath的环境的上下文中,为urn:shop.fruit
名称空间定义名称空间前缀:
u=urn:shop.fruit
然后,使用以下XPath
/u:Products/u:Stock/u:product[not(@name = /u:Products/u:Prices/u:product/@name)]/@name
将返回
banana
orange
根据要求。
更新:
下面是@Tomalak建议的一个较短的解决方案:
/u:Products/u:Stock/u:product/@name[not(. = /u:Products/u:Prices/u:product/@name)]
@Tomalak和@JLRishe还提供了有用的解释,说明这些解决方案是有效的,因为在XPath中,
X=Y
是一个集合操作,其操作类似于内部联接@JLRishe进一步指出,X!=Y
也是一个集合操作,但具体来说并不等同于not(X=Y)
@Tomalak=
也是一个集合操作,其工作方式类似于内部联接。这就是为什么X!=Y
与不一样(X=Y)
@jlRish你当然是对的。很遗憾,我不能再编辑我的评论了,所以我删除了它。