我有这个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运算符。
有什么建议吗?
答案 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)
。