如何通过XPATH检查所有父元素中是否存在元素

时间:2012-10-12 07:02:15

标签: xml xpath

如果我们有XML文档:

<?xml version="1.0" encoding="utf-8"?>
<STICKERINFO>
    <ORDER>
        <NUMBER>0171467783</NUMBER>
        <STICKER>
            <ARTICLE>03359140001</ARTICLE>
        </STICKER>
        <STICKER>
            <ARTICLE>11408038001</ARTICLE>
        </STICKER>
    </ORDER>
    <ORDER>
        <NUMBER>0171473000</NUMBER>
    </ORDER>
</STICKERINFO>

我可以检查/STICKERINFO/ORDER/STICKER/ARTICLE是否存在:

boolean(/STICKERINFO/ORDER/STICKER/ARTICLE)

但是如何检查所有 /STICKERINFO/ORDER/中是否存在/ STICKERINFO / ORDER / STICKER / ARTICLE?

在当前示例中,XPATH表达式应返回false

2 个答案:

答案 0 :(得分:4)

此XPath 1.0(以及XPath 2.0)表达式

boolean(/STICKERINFO/ORDER[not(STICKER/ARTICLE)])
当至少有一个true()元素没有/STICKERINFO/ORDER后代时,

会生成STICKER/ARTICLE

因此,您所追求的(其中一个)XPath表达式是

not(/STICKERINFO/ORDER[not(STICKER/ARTICLE)])

<强>解释

这是 Double Negation Law 的简单应用。 :)

答案 1 :(得分:3)

XPath 2.0拥有'every':

 every $order in /STICKERINFO/ORDER satisfies boolean($order/STICKER/ARTICLE)

在XPath 1中,您可以测试每个订单是否有文章,即订单数量是否与订单数量相同:

  count(/STICKERINFO/ORDER) =  count(/STICKERINFO/ORDER[STICKER/ARTICLE])