【发布时间】:2017-12-05 23:49:38
【问题描述】:
我相信这是可能的,但无法弄清楚语法。像这样的:
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
但这是不正确的。
【问题讨论】:
-
好问题,+1。请参阅我的答案,了解可能恰好选择所有叶节点的最短 XPath 表达式。 :)
标签: syntax xpath selectnodes
我相信这是可能的,但无法弄清楚语法。像这样的:
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
但这是不正确的。
【问题讨论】:
标签: syntax xpath selectnodes
使用:
//node()[not(node())]
如果只需要 element 叶节点(这需要澄清——具有非元素子节点的元素是否被视为叶节点?),则以下 XPath 表达式将选择它们:
//*[not(*)]
上述两个表达式可能是最短的,它们选择了所需的节点(任意节点或元素 -- 叶节点)。
【讨论】:
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/…
任何没有子元素的元素
//*[not(child::*)]
【讨论】:
//*[not(*)] 有什么区别?
为什么小于 或等于 到 1 ?
xmlNode.SelectNodes("//*[count(child::*) = 0]")
在此站点进行测试等http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm
很有帮助..
我正在添加这个 XSLT 答案,因为谷歌的前场比赛似乎缺乏这样的解决方案:
经过长期努力将 CDATA 提取为 XML,最终,这个表达式最适合我:
<xsl:template match="*[not(child::*)]/text()">
【讨论】: