XPath选择没有具有特定值的子节点的XML节点?

时间:2016-11-11 15:12:16

标签: xml xpath

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<targets>
    <target sanctions-set-id="4387" ssid="5762">
        <individual>
            <identity ssid="5764" main="true">
                <name ssid="27036" name-type="primary-name">
                    <value>SomeName1</value>
                </name>
            </identity>
        </individual>
        <modification modification-type="de-listed" enactment-date="2016-02-29" publication-date="2016-03-01" effective-date="2016-03-01"/>
        <modification modification-type="amended" enactment-date="2015-11-17" publication-date="2015-11-18" effective-date="2015-11-18"/>
        <modification modification-type="amended" enactment-date="2014-11-27" publication-date="2014-11-28" effective-date="2014-11-28"/>
        <modification modification-type="amended" enactment-date="2013-12-18" publication-date="2013-12-19" effective-date="2013-12-20"/>
        <modification modification-type="listed"/>
    </target>
    <target sanctions-set-id="4388" ssid="5763">
        <individual>
            <identity ssid="5765" main="true">
                <name ssid="27037" name-type="primary-name">
                    <value>SomeName2</value>
                </name>
            </identity>
        </individual>
        <modification modification-type="amended" enactment-date="2015-11-17" publication-date="2015-11-18" effective-date="2015-11-18"/>
        <modification modification-type="amended" enactment-date="2014-11-27" publication-date="2014-11-28" effective-date="2014-11-28"/>
        <modification modification-type="amended" enactment-date="2013-12-18" publication-date="2013-12-19" effective-date="2013-12-20"/>
        <modification modification-type="listed"/>
    </target>   
</targets>

我需要选择任何没有修改类型子节点的目标节点。换句话说,我的xpath应该只返回SomeName2的第二个目标,因为没有已删除的修改类型。

这是我能够得到的最接近的,但它仍然会选择这两种。

targets/target[modification[@modification-type != 'de-listed']]

1 个答案:

答案 0 :(得分:1)

XPath选择这两者的原因是因为两者都有modification个元素,@modification-type属性等于de-listed以外的值。使用not()代替!= ...

这个XPath,

//target[not(modification[@modification-type = 'de-listed'])]

将选择所有target元素与没有 modification子级modification-type属性等于de-listed的孩子。