【问题标题】:XPath: How do I select text() or a span element within a parent elementXPath:如何在父元素中选择 text() 或 span 元素
【发布时间】:2012-05-30 20:24:48
【问题描述】:

我有一个父元素(字体),我想选择所有子元素(直接后代),它们是 text() 或 span 元素。我将如何构建这样的 xpath?

【问题讨论】:

    标签: xpath


    【解决方案1】:

    如果当前节点是font 元素,则如下所示:

    text()|span
    

    否则,您必须始终将两个完整的 XPath 与 | 结合起来 - 一个用于文本,一个用于跨度,例如:

    font/text()|font/span
    

    如果当前节点刚好在font上方 - 或

    //a[text()='View Larger Map']/../../../../div[contains(@class, 'paragraph')][3]/font/span|//a[text()='View Larger Map']/../../../../div[contains(@class, 'paragraph')][3]/font/text()
    

    如果从具有一些复杂选择标准的根开始。

    如果您有像最后一个这样的复杂路径,最好将部分路径存储在变量中 - 例如在 XSLT 中:

    <xsl:variable name="font" select="//a[text()='View Larger Map']/../../../../div[contains(@class, 'paragraph')][3]/font"/>
    
    . . . 
    
    <xsl:for-each select="$font/span|$font/text()">
      . . . 
    </xsl:for-each>
    

    另一种可能性是这样做:

    //a[text()='View Larger Map']/../../../../div[contains(@class, 'paragraph')][3]/font/node()[name()='span' or name()='']
    

    因为name()text() 节点返回了一个空字符串,所以这有效——但我不能100% 确定它是否适用于所有XPath 处理器,它可能会错误地匹配注释节点。

    【讨论】:

    • 我是否需要一些括号或类似的东西,因为如果我尝试 "//a[text()='View Larger Map']/../../../../div[ contains(@class, 'paragraph')][3]/font/span|text()",我得到子跨度(但没有文本元素),如果我这样做 "//a[text()='View Larger Map']/../../../../div[contains(@class, 'paragraph')][3]/font/text()|span",我得到了文本元素但没有跨度。感谢您的任何澄清
    • 评论节点也没有名字。因此,这个答案需要更正。文档节点(根节点)是另一种没有名称的节点,但在这种特定情况下可以安全地省略。
    • @DimitreNovaatchev:我写了'......它可能会错误地匹配注释节点' - 只有当您确定源中没有 cmetsw 时才能使用第二种解决方案,第一个应该始终有效。
    • @MiMo:是的。我在评论中所说的是,提供有问题的解决方案并指出其问题是不可接受的。解决这个有问题的解决方案并提供固定的解决方案要好得多——在这种特殊情况下,这可能的。
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 2016-02-07
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多