【问题标题】:XPath: Select self and following sibling togetherXPath:一起选择自己和跟随的兄弟姐妹
【发布时间】:2013-05-16 09:43:43
【问题描述】:
<div>
    <dt>
        Test 1
    </dt>
    <dd>
    </dd>
    <dt>
        Test 2
    </dt>
    <dd>
    </dd>
</div>

到目前为止,我已经编写了这个 XPath

//dt[contains(text(), "Test")]/self::dt|following-sibling::dd

但这并没有同时带来 dtdd,而只是带来 dt

【问题讨论】:

    标签: html xpath


    【解决方案1】:

    如果它必须是单个 XPath 1.0 表达式,那么您必须说

    //dt[contains(., 'Test')] | //dt[contains(., 'Test')]/following-sibling::dd[1]
    

    最后的[1] 很重要,因为如果没有它,它会提取 所有 dd 元素,这些元素跟在包含“Test”的 dt 之后,即给定

    <div>
        <dt>
            Test 1
        </dt>
        <dd>
            Foo
        </dd>
        <dt>
            Something else 2
        </dt>
        <dd>
            Bar
        </dd>
    </div>
    

    没有[1] 的版本将匹配三个节点,dt 包含“Test 1”和 both“Foo”和“Bar”dd 元素。 使用[1],您只会正确获得“Test 1”和“Foo”。

    但根据您使用 XPath 的确切方式,首先选择可能更清楚

    //dt[contains(., 'Test')]
    

    然后遍历匹配的节点,并评估

    . | following-sibling::dd[1]
    

    依次在每个节点的上下文中。

    【讨论】:

      【解决方案2】:

      使用 XPath 2.0 时:

      //dt[contains(text(), "Test")]/(self::dt, following-sibling::dd)
      

      【讨论】:

      • 这非常简洁。但我使用的是 1.0
      【解决方案3】:

      试试这个 XPATH:

      //dt[contains(text(), "Test")]/self::dt or //dt[contains(text(), "Test")]/following-sibling::dd
      

      【讨论】:

      • 这就是我使用的替代方法,但这很长:)
      • 如果您使用“1.0”,这是唯一的选择
      【解决方案4】:

      为避免对 dt 元素重复 contains 测试,您可以重写查询,以便所有所需的输出元素仅在搜索条件中表达一次:

      //*[contains(self::dt|self::dd/preceding-sibling::dt[1],"Test")]
      

      解释:从所有可能的输出元素池开始,在这些元素中,选择dtdd,前面有dt,其中dt 匹配搜索。

      包含这个答案是为了展示一种减少代码重复并更容易阅读表达式的联合运算符|...

      【讨论】:

        【解决方案5】:

        根据您的示例,您可能可以使用此 xpath,它更短更简单,但假设您正在寻找 dt,然后您想要 dt 的所有兄弟姐妹(不仅仅是以下兄弟姐妹和自己)。此 xpath 查找 dt 的父级并获取其所有子级:

        //dt[contains(text(), "Test")]/../*
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-09
          • 1970-01-01
          相关资源
          最近更新 更多