查找与属性相关的元素,重点放在其中一种元素上

时间:2019-01-31 01:57:18

标签: xml xpath xpath-1.0

我正在尝试找到一种方法来确保XML中存在具有某些属性值的元素,并且使用XPath可以确保它们具有匹配的不同元素。

我正在使用数据验证器来获取组织发出的信息。我需要执行的验证之一是,如果容器2中有一个Description元素,其中包含具有Word属性为GNC的Description Type元素,则需要有一个Item元素,其中容器1具有Item Type元素内部ID值相同,并且Word值等于C或G。

示例XML:

<Root>
<Container1 ID="38715795">
    <Item ID="119479" InternalID="2090205">
        <ItemType Word="C">A Value</ItemType>
    </Item>
    <Item ID="119480" InternalID="2090206">
        <ItemType Word="NP">B Value</ItemType>
    </Item>
    <Item ID="175656" InternalID="2137464">
        <ItemType Word="C">A Value</ItemType>
    </Item>
</Container1>
<Container2 ID="38715802">
    <Description ID="119479" InternalID="2090205">
        <DescriptionType Word="GNC">Description Z</DescriptionType>
    </Description>
    <Description ID="119480" InternalID="2090206">
        <DescriptionType Word="P">Description W</DescriptionType>
    </Description>
    <Description ID="175656" InternalID="2137464">
        <DescriptionType Word="P">Description Z</DescriptionType>
    </Description>
</Container2>
</Root> 

我认为我已经很接近了。经过与Google Foo的大量查找,我发现了XPath函数。以下内容使我接近:

boolean(/Root/Container2/Description/@InternalID[../DescriptionType/@Word = 'GNC'] != /Root/Container1/Item/@InternalChargeID[../ItemType/@Word = "C" or ../ItemType/@Word = "G"])

问题是可能存在Item元素具有C或G Word值而没有匹配的Description值并且没关系。示例XML中的情况应该可以,但是路径返回的是true而不是false。我需要找到一种方法来检查每个Description元素是否都有Item元素,而不必关心每个Item元素是否都有Description元素。

1 个答案:

答案 0 :(得分:1)

那是因为您的xpath在右侧:

/Root/Container1/Item/@InternalChargeID[../ItemType/@Word = "C" or ../ItemType/@Word = "G"]

两者都匹配

<Item ID="119479" InternalID="2090205">

<Item ID="175656" InternalID="2137464">

此xpath返回false:

boolean(/Root/Container2/Description[DescriptionType/@Word = 'GNC']/@InternalID !=
    /Root/Container1/Item[@InternalID = 
/Root/Container2/Description[DescriptionType/@Word =
    'GNC']/@InternalID][ItemType/@Word = 'C' or ItemType/@Word = 'G']/@InternalID)

它向具有相同Item的{​​{1}}个节点添加谓词