XPath获取没有父节点的所有子节点(元素,注释和文本)

我需要一个XPath来获取没有父元素的所有ChildNode(包括文本元素,注释元素和子元素)。 任何帮助

示例示例:

<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 &amp; 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 TRIED

  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::*select上下文节点的所有元素子元素

child::text()select上下文节点的所有文本节点子节点

child::node()select上下文节点的所有子节点,无论它们的节点types如何

所以我猜你的答案是:

 $doc/PRESENTEDIN/X/child::node() 

如果你想要一个所有嵌套节点的扁平数组:

 $doc/PRESENTEDIN/X/descendant::node() 

使用这个XPathexpression式

 /*/*/X/node() 

这将select作为XML文档顶部元素的最大子元素的任何X元素的子元素的任何节点(元素,文本节点,注释或处理指令)。

为了validationselect的什么 ,这里是这个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 /> 

说明

  1. 正如W3 XPath 1.0规范中所定义的那样 ,“ child::node()select上下文节点的所有子节点,不pipe节点types如何”。 这意味着任何元素,文本节点,注释节点和处理指令节点的子节点都是由这个节点testingselect的。

  2. node()child::node()的缩写(因为child::是主轴,并且在没有明确指定轴时使用)。