2011-02-25 45 views
39

我需要一個XPath來獲取所有的childNodes(包括文本元素,評論元素&子元素)無父元素。任何幫助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 &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受審

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> 

回答

51

從的XPath的文檔(http://www.w3.org/TR/xpath/#location-paths):

child::*選擇所有元素的上下文節點

child::text()的 兒童選擇所有文本節點上下文節點的 兒童

child::node()選擇所有CONTEX的 孩子T結點,無論 它們的節點類型

所以我想你的答案是:

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

如果你想所有嵌套節點的扁平化陣列:

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

正確的,但確實也檢查[縮寫語法(http://www.w3.org/TR/xpath/#path-abbrev) – 2011-02-25 16:49:36

+0

感謝,解決了我的疑問。非常感謝 – kadalamittai 2011-02-25 16:59:54

+0

我使用它來複制所有的子節點,但是在輸出上,每個子元素都加上了一個名稱空間標識符;任何方法都可以禁用這個標識符? – raffian 2012-02-01 20:22:54

20

使用此XPath表達式

/*/*/X/node() 

這將選擇任何節點(元素,文本節點,註釋或處理指令),該任何X元素是XML文檔的頂部元件的一個大孩子的孩子。

爲了驗證什麼是選擇,這裏是輸出正是選擇的節點此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()選擇上下文節點的所有子,無論其節點類型。「這意味着任何元素,文本節點,註釋節點和處理指令節點的子節點是由該節點測試選擇。

  2. node()child::node()(因爲child::是主軸線的縮寫,並用於當無軸明確指定)。

+0

+1爲一個很好的解決方案。 – Flack 2011-02-25 18:15:59

+0

@DimitreNovatchev返回舊日:p謝謝任何方式 – Nabin 2017-04-15 16:45:17

+0

@Spiderman,是的,我們應該懷舊嗎?現在我們有XSLT 3.0和XPath 3.1 – 2017-04-15 17:04:59

相關問題