【问题标题】:xPath equivalent for CSS :nth-of-type(n)CSS 的 xPath 等效项:nth-​​of-type(n)
【发布时间】:2018-01-29 12:15:23
【问题描述】:

如何使用 xPath 选择 其类型的第一个节点? 在 CSS 中,我使用 a :nth-of-type(1)。预期结果是 bсfirst d 节点(文本 = '1')

  <a>
        <b>1
            <c>1</c>
        </b>
        <d>1</d>
        <d>2</d>
        <d>3</d>
    </a>

【问题讨论】:

    标签: html xpath css-selectors


    【解决方案1】:

    纯 XPath 1.0 中的棘手问题。

    在 XSLT 中,这通常是分组算法的一部分,所以在 2.0 中你会写

    <xsl:for-each-group select="*" group-by="node-name()">
       .. current-group()[1] ..
    

    或者在独立的 XPath 2.0 中,您可以执行类似的操作

    //*[not(node-name() = preceding-sibling::*/node-name())]
    

    但是我在 XPath 1.0 中看不到这样做的方法。看看为什么需要它会很有趣。

    【讨论】:

    • 迈克尔,感谢您的好主意!那么为什么需要它:我想将简单的包实现到convert css to xpath。如有问题,欢迎css和xpath高手回复。
    【解决方案2】:

    所以,答案.. XPath 1.0 中的实现基于Michael Kay 的精彩答案。

    对于 :nth-of-type(1) 它看起来像:

    //a//*[name(preceding-sibling::*[1]) != name()]
    

    对于 :nth-of-type(n) 其中 n > 1 它看起来像:

    //a//*[name(preceding-sibling::*[n]) != name() and name(preceding-sibling::*[n-1]) = name()]
    

    当然,这很棘手,在大多数情况下可以用更明显的功能代替。 目标是找到完全一样的 CSS 伪的 XPath 实现。

    【讨论】:

    • 不要依赖 name() 的字符串比较 - name() 函数对命名空间前缀很敏感。您需要独立测试namespace-uri()local-name()
    • @MichaelKay,命名空间uri 也没有在 css 定位器中定义。如果 dom 中的命名空间可以使上面的 Xpath 匹配与 CSS :nth-of-type 不一样,你能举个例子吗?关于name()local-name()Xpath Reference说:name函数返回的字符串与local-name函数返回的字符串相同,除了元素节点和属性节点
    • 我不知道 CSS 如何处理命名空间。但在 XPath 中,如果要按名称比较两个元素,则应比较名称空间 URI 和本地名称,并忽略任何前缀。使用 name() 不会忽略前缀。 (是的,name() 和 local-name() 除了元素和属性是一样的。但想必我们主要关心元素!)
    猜你喜欢
    • 2014-11-29
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多