如何在XPath中进行否定连接(“除”)?

时间:2015-01-11 04:10:01

标签: 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="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 >

我希望XPath能够为我提供stock标签中所有产品的名称,除了Price标签内的产品。 我想要的结果是:name =&#34; banana&#34 ;;名称=&#34;橙&#34 ;. 我试过这个XPath:/Produtos/Stock/produto/@nome except /Produtos/Preços/produto/@nome 但似乎不接受except运算符。 有什么建议吗?

1 个答案:

答案 0 :(得分:4)

except运算符仅在XPath 2.0中可用,但您可以在没有except的情况下在XPath 1.0(和XPath 2.0)中完成所需的操作...

首先,在将评估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是一个像INNER JOIN一样运行的集合操作。 @JLRishe进一步指出X != Y也是一个集合操作,但具体上不等同于not(X = Y)