代码之家  ›  专栏  ›  技术社区  ›  William Buckingham

使用前面和后面约束XPath同级关系

  •  1
  • William Buckingham  · 技术社区  · 9 年前

    我需要了解如何创建一个XPath,以仅返回值为2的root_level元素的id值,该值紧跟在root_level1值之后。我在网站上花了几个小时回顾了之前对类似帖子的回复,但它们没有我遇到的相同类型的限制。

    下面是一个示例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结果限制为仅与特定root_level1名称相关的结果相匹配,我将不胜感激。谢谢

    1 回复  |  直到 9 年前
        1
  •  1
  •   har07    9 年前

    你可以用这种方式把所有 根级别-2 id 与某些元素相对应的元素 公司 ,即 'Company A' :

    //item[root_level=2][preceding-sibling::item[root_level=1][1][name='Company A']]/id
    
    • //item[root_level=2] :查找所有根级别-2 <item> ...
    • [preceding-sibling::item[name][1][name='Company A']] :…具有最近的前一个同级root-level-1 <name> 等于 "Company A"
    • /id :然后返回 <id> 子元素