Поиск элементов, связанных по атрибутам с акцентом на один из элементов - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь найти способ убедиться, что, если элемент с определенными значениями атрибутов присутствует в XML, они имеют соответствующий другой элемент, используя XPath.

Я работаю над даннымиВалидатор для информации, которую моя организация рассылает.Одна из проверок, которые мне нужно выполнить, заключается в том, что если в контейнере 2 есть элемент Description, который имеет элемент Description Type с атрибутом Word, который является GNC, то должен быть элемент Item с контейнером 1 элемента Item Type, который имеетто же значение внутреннего идентификатора и значение 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.Мне нужно найти способ проверить, есть ли элемент Item для каждого элемента Description, не заботясь о том, есть ли элемент Description для каждого элемента Item.

1 Ответ

0 голосов
/ 31 января 2019

Это потому, что ваш 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 узлов с одинаковыми @InternalID

...