【问题标题】:how to select node by text omitting node's childes' text如何通过文本选择节点省略节点的孩子的文本
【发布时间】:2014-11-08 10:36:08
【问题描述】:

我有以下代码,我想按文本选择标签。我不能使用//label[text()='some label']//label[text()='other label'] 有两个原因:

  • '//label[text()]' 返回当前节点的全部内容,包括 span 的内容,
  • 空白。

我可以使用 contains() 函数,但我真的不想。

<label>
<span>some span</span>
  some label   
</label>

<label>
    other label
<span>other span</span>
</label>

解决了???

//label[normalize-space(text()) = 'some label']

但是为什么这会剥离内部节点呢?我不明白。根据http://www.w3.org/TR/xpath/#function-normalize-space,应该只删除空格,而不是节点。

【问题讨论】:

    标签: html xpath


    【解决方案1】:

    如果你使用

    //label[text()[normalize-space() = 'some label']]
    

    那么我希望你得到你想要的。然而,它也会选择像

    这样的标签
    <label>text1<span>span text</span>some label</label>
    

    XPath 1.0 通常具有混合内容和多个子文本节点,要满足所有可能的情况有点困难,使用 XPath 2.0 你可以做到//label[normalize-space(string-join(text(), '')) = 'some label'] 更精确。

    【讨论】:

    • 哪种语法更好: //label[text()[normalize-space() = 'some label']] vs //label[normalize-space(text()) = 'some label ']
    • 更重要的是为什么 normalize-space() 修剪内部节点。这对我来说至关重要。
    • 您需要解释什么是“内部节点”,以及当您说“normalize-space() 修剪内部节点”时,您注意到哪些行为需要解释。我的建议//label[text()[normalize-space() = 'some label']] 和您的代码之间的主要区别在于我的建议选择label 元素,这些元素具有(至少)一个文本子节点,其标准化字符串值为some label 为什么您的尝试选择label 元素,其中第一个文本子节点的标准化字符串值为some label。对于您的示例,第一个文本子节点是空白。
    • Martin,我需要按文本选择标签。在此标签内有 span 节点及其文本 - 我需要忽略它。我使用文本()。我只想比较标签内的文本,而不是跨度内的文本。因此从标签的角度来看,span 是“内部节点”。我看到text()normalize-space() 的组合工作正常。我的问题是为什么normalize-space() 会忽略 span 的内容?我不明白这种行为。你能给我解释一下或指出一些文件吗?
    • Martin,还有一件事:为什么//label[text()[normalize-space() = 'some label']] 选择具有(至少)一个文本子节点的标签元素,其规范化字符串值为some label//label[normalize-space(text()) = 'some label'] 不是?我真的很想明白。并感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2020-02-07
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多