Xml 如何在XPath中进行负联接(“除”)呢?

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

我有以下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="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你当然是对的。很遗憾,我不能再编辑我的评论了,所以我删除了它。