查找与属性相关的元素,重点放在其中一个元素上
Finding elements related by attributes with emphasis on one of the elements
我正在尝试找到一种方法来确保如果 XML 中存在具有特定属性值的元素,则它们具有使用 XPath 的匹配不同元素。
我正在为我的组织发出的信息开发数据验证器。我需要执行的验证之一是,如果容器 2 中有一个 Description 元素,其 Description Type 元素的 Word 属性为 GNC,则需要有一个 Item 元素,其 Item Type 元素容器 1 具有相同的内部 ID 值和 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 元素。
那是因为你的xpath在右边:
/Root/Container1/Item/@InternalChargeID[../ItemType/@Word = "C" or ../ItemType/@Word = "G"]
两者都匹配
<Item ID="119479" InternalID="2090205">
<Item ID="175656" InternalID="2137464">
这个 xpath returns 错误:
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)
它向具有相同 @InternalID
的 Item
个节点添加谓词
我正在尝试找到一种方法来确保如果 XML 中存在具有特定属性值的元素,则它们具有使用 XPath 的匹配不同元素。
我正在为我的组织发出的信息开发数据验证器。我需要执行的验证之一是,如果容器 2 中有一个 Description 元素,其 Description Type 元素的 Word 属性为 GNC,则需要有一个 Item 元素,其 Item Type 元素容器 1 具有相同的内部 ID 值和 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 元素。
那是因为你的xpath在右边:
/Root/Container1/Item/@InternalChargeID[../ItemType/@Word = "C" or ../ItemType/@Word = "G"]
两者都匹配
<Item ID="119479" InternalID="2090205">
<Item ID="175656" InternalID="2137464">
这个 xpath returns 错误:
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)
它向具有相同 @InternalID
Item
个节点添加谓词