使用前后约束 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> 子元素