使用前后约束 XPath 兄弟关系
Constraining XPath sibling relationships using preceding and following
我需要了解如何为 return 紧跟 root_level 1 值的 root_level 元素的值为 2 的元素创建仅 id 值的 XPath .我在网站上花了几个小时查看之前对类似帖子的回复,但它们没有我遇到的相同类型的限制。
这是一个示例 XML 片段。它们可以 多 长:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<item>
<id>659478</id>
<name>Company A</name>
<root_level>1</root_level>
</item>
<item>
<id>692557</id>
<root_level>2</root_level>
</item>
<item>
<id>659482</id>
<root_level>2</root_level>
</item>
<item>
<id>666534</id>
<root_level>3</root_level>
</item>
<item>
<id>665260</id>
<root_level>3</root_level>
</item>
<item>
<id>665773</id>
<root_level>3</root_level>
</item>
<item>
<id>635003</id>
<name>Company B</name>
<root_level>1</root_level>
</item>
<item>
<id>635005</id>
<root_level>2</root_level>
</item>
<item>
<id>635015</id>
<root_level>2</root_level>
</item>
<item>
<id>671626</id>
<root_level>2</root_level>
</item>
<item>
<id>584793</id>
<name>Company C</name>
<root_level>1</root_level>
</item>
<item>
<id>623716</id>
<root_level>2</root_level>
</item>
<item>
<id>698585</id>
<root_level>3</root_level>
</item>
</result>
我尝试了以下 XPath 的变体,但这需要始终知道下一个 root_level1 名称。请注意,也可能没有以下 root_level 3 个值。唯一不变的是 root_level 1 始终存在。
//item[root_level=2][preceding-sibling::item[name='Company A'] and following-sibling::item[name='Company B']]/id
此外,我不得不在我的解决方案中使用 XPath 1.0。
如果有人能指出我正确的方向来限制 root_level 2 结果 returned 以仅匹配那些基于后代顺序的特定 root_level 1 名称,我将不胜感激。谢谢
你可以尝试这种方式 return 所有 root-level-2 id 对应于某些 company 的元素,即 'Company A'
:
//item[root_level=2][preceding-sibling::item[root_level=1][1][name='Company A']]/id
//item[root_level=2]
: 查找所有 root-level-2 <item>
...
[preceding-sibling::item[name][1][name='Company A']]
: ...最近的前一个兄弟根级 1 <name>
等于 "Company A"
/id
: 然后 return <id>
子元素
我需要了解如何为 return 紧跟 root_level 1 值的 root_level 元素的值为 2 的元素创建仅 id 值的 XPath .我在网站上花了几个小时查看之前对类似帖子的回复,但它们没有我遇到的相同类型的限制。
这是一个示例 XML 片段。它们可以 多 长:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<item>
<id>659478</id>
<name>Company A</name>
<root_level>1</root_level>
</item>
<item>
<id>692557</id>
<root_level>2</root_level>
</item>
<item>
<id>659482</id>
<root_level>2</root_level>
</item>
<item>
<id>666534</id>
<root_level>3</root_level>
</item>
<item>
<id>665260</id>
<root_level>3</root_level>
</item>
<item>
<id>665773</id>
<root_level>3</root_level>
</item>
<item>
<id>635003</id>
<name>Company B</name>
<root_level>1</root_level>
</item>
<item>
<id>635005</id>
<root_level>2</root_level>
</item>
<item>
<id>635015</id>
<root_level>2</root_level>
</item>
<item>
<id>671626</id>
<root_level>2</root_level>
</item>
<item>
<id>584793</id>
<name>Company C</name>
<root_level>1</root_level>
</item>
<item>
<id>623716</id>
<root_level>2</root_level>
</item>
<item>
<id>698585</id>
<root_level>3</root_level>
</item>
</result>
我尝试了以下 XPath 的变体,但这需要始终知道下一个 root_level1 名称。请注意,也可能没有以下 root_level 3 个值。唯一不变的是 root_level 1 始终存在。
//item[root_level=2][preceding-sibling::item[name='Company A'] and following-sibling::item[name='Company B']]/id
此外,我不得不在我的解决方案中使用 XPath 1.0。
如果有人能指出我正确的方向来限制 root_level 2 结果 returned 以仅匹配那些基于后代顺序的特定 root_level 1 名称,我将不胜感激。谢谢
你可以尝试这种方式 return 所有 root-level-2 id 对应于某些 company 的元素,即 'Company A'
:
//item[root_level=2][preceding-sibling::item[root_level=1][1][name='Company A']]/id
//item[root_level=2]
: 查找所有 root-level-2<item>
...[preceding-sibling::item[name][1][name='Company A']]
: ...最近的前一个兄弟根级 1<name>
等于"Company A"
/id
: 然后 return<id>
子元素