【问题标题】:How to select all leaf nodes using XPath expression?如何使用 XPath 表达式选择所有叶节点?
【发布时间】:2017-12-05 23:49:38
【问题描述】:

我相信这是可能的,但无法弄清楚语法。像这样的:

xmlNode.SelectNodes("//*[count(child::*) <= 1]")

但这是不正确的。

【问题讨论】:

  • 好问题,+1。请参阅我的答案,了解可能恰好选择所有叶节点的最短 XPath 表达式。 :)

标签: syntax xpath selectnodes


【解决方案1】:

使用

//node()[not(node())]

如果只需要 element 叶节点(这需要澄清——具有非元素子节点的元素是否被视为叶节点?),则以下 XPath 表达式将选择它们:

//*[not(*)]

上述两个表达式可能是最短的,它们选择了所需的节点(任意节点或元素 -- 叶节点)。

【讨论】:

  • 您能解释一下为什么会这样吗?我查看了 XPath 语法和一些教程,但我不太明白为什么会这样。
  • @rrs:根据定义,第一个表达式选择 XML 文档中没有任何子节点的任何节点——这就是叶节点。第二个做类似的事情,但它选择任何没有子元素的元素 - 元素。
  • 我了解它的作用,但不了解它是如何做到的。 not(*) 为什么/如何选择叶节点/元素?
  • not(*) 表示“没有任何元素子元素”,因为“* 选择上下文节点的所有元素子元素”,根据 W3C XPath 1.0 建议:w3.org/TR/xpath/#path-abbrev(第二个项目符号)。这是一个非常简短的解释,要深入了解,需要或多或少完整的 XPath 课程。我可以厚颜无耻地推荐我的 Pluralsight 培训课程的第二个模块“XSLT 2.0 和 1.0 基础”吗?本课程的标题是“A Crash Course in XPath”,时长 70 分钟:pluralsight.com/training/Courses/TableOfContents/…
  • 谢谢,我去看看。
【解决方案2】:

任何没有子元素的元素

//*[not(child::*)]

【讨论】:

  • +1 正确答案。但这意味着:任何没有子元素的元素。因此,它将选择具有文本节点子节点的元素、空元素、具有混合内容的元素(文本节点、PI、cmets)
  • 您可能的意思是:“没有子元素的元素”——而不是“没有子元素的元素”。承认这一点并更正您原本不错的答案的文字会很好。
  • @Dimitre 感谢您握住我的手。我很n00b。
  • 与@DimitreNovaatchev 的//*[not(*)] 有什么区别?
  • @lajarre,这相当于我回答中的第二个表达式——只是更长。
【解决方案3】:

为什么小于 或等于 到 1 ?

xmlNode.SelectNodes("//*[count(child::*) = 0]")

在此站点进行测试等http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

很有帮助..

【讨论】:

  • 非常感谢。这很好用。所以,它更像是 VB 风格。我认为它应该是 c 风格的,因为函数是区分大小写的。为什么x 返回 1,但为 返回 0。
  • 和@miliu:不需要计数测试。检查@kevpie 的答案。
【解决方案4】:

我正在添加这个 XSLT 答案,因为谷歌的前场比赛似乎缺乏这样的解决方案:

经过长期努力将 CDATA 提取为 XML,最终,这个表达式最适合我:

<xsl:template match="*[not(child::*)]/text()">

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多