我需要一个 XPath 来获取所有没有父元素的子节点(包括文本元素、评论元素和子元素)。任何帮助
示例:
<DOC>
<PRESENTEDIN>
<X>
First Text Node #1
<y> Y can Have Child Nodes #
<child> deep to it </child>
</y>
Second Text Node #2 <z/>
</X>
<EVTS>
<evt/>
<evt>
<mtg_descr> SAE 2006 World Congress & Exhibition </mtg_descr>
<sess_descr> Advanced Hybrid Vehicle Powertrains (Part 1 of 5) </sess_descr>
<loc> Detroit,MI,United States </loc>
<sess_prod_grp_cd> TSESS </sess_prod_grp_cd>
<sess_evt_name> P13 </sess_evt_name>
<sess_gen_num> 138352 </sess_gen_num>
<mtg_start_dt> 04/03/2006 </mtg_start_dt>
<mtg_end_dt> 04/06/2006 </mtg_end_dt>
<desig> CONGRESS-2006 </desig>
</evt>
</EVTS>
<EVTTYPE>PAPER</EVTTYPE>
<SUPERTECH>
<![CDATA[C8585]]>
</SUPERTECH>
</PRESENTEDIN>
XPATH 已尝试
1. $doc/PRESENTEDIN/X
2. $doc/PRESENTEDIN/X/descendant::*
2. $doc/PRESENTEDIN/X/self::*
预期输出
First Text Node #1
<y> Y can Have Child Nodes #
<child> deep to it </child>
</y>
Second Text Node #2 <z/>
我不想
<X>
First Text Node #1
<y> Y can Have Child Nodes #
<child> deep to it </child>
</y>
Second Text Node #2 <z/>
</X>
从 XPath ( http://www.w3.org/TR/xpath/#location-paths ) 的文档中:
child::* 选择上下文节点的所有子元素 child::text() 选择上下文节点的所有文本节点子节点 child::node() 选择上下文节点的所有子节点,无论它们的节点类型如何
所以我猜你的答案是:
$doc/PRESENTEDIN/X/child::node()
如果你想要一个所有嵌套节点的扁平数组:
$doc/PRESENTEDIN/X/descendant::node()
使用这个 XPath 表达式:
/*/*/X/node()
这将选择作为 XML 文档顶部元素的孙子元素的任何 X
元素的子元素的任何节点(元素、文本节点、注释或处理指令)。
为了验证选择了什么,下面是这个 XSLT 转换,它准确地输出了选择的节点:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:copy-of select="/*/*/X/node()"/>
</xsl:template>
</xsl:stylesheet>
它产生了想要的、正确的结果:
First Text Node #1
<y> Y can Have Child Nodes #
<child> deep to it </child>
</y> Second Text Node #2
<z />
解释:
正如 W3 XPath 1.0 规范中定义的那样,“child::node() 选择上下文节点的所有子节点,无论它们的节点类型如何。”这意味着该节点测试选择了任何元素、文本节点、注释节点和处理指令节点子节点。 node() 是 child::node() 的缩写(因为 child:: 是主轴,并且在没有明确指定轴时使用)。