2012-12-13 44 views
0

節點我有類似下面的一個XML:如何獲得節點,選擇兒童使用XPath

<?xml version='1.0' encoding='utf-8'?> 
<Document> 
    <name>SMTH</name> 
    <Group> 
     <GroupHeader>Some Description</GroupHeader> 
     <Port> 
      <ID>13553</PortID> 
      <Name>Some name</PortName> 
      <Number>PO1005</WorldPortNumber> 
      <Section> 
       <SectionHeader ID="63">General overview</SectionHeader> 
       <PAR ID="59341" updatedate="19/05/2010 08:35:51">Important data</PAR> 
      </Section> 
      <Section> 
       <SectionHeader ID="66">Max size</SectionHeader> 
       <PAR ID="59344" updatedate="19/05/2010 08:35:51">Important data</PAR> 
      </Section> 
     </Port> 
    </Group> 
</Document> 

我想選擇所有端口的節點,包括只有 ID,姓名,號碼和PAR兒童節點(其餘子節點應該被忽略)。結果應該只是包含上面列出的4個子節點的端口節點的集合。 這裏是什麼是應該是這樣的:

Port: 
    ID=234234 
    Name=blabla 
    Number=324234 
    PAR=sdfsdfs 
    PAR=fgfgfg 
Port: 
    ID=5555 
    Name=blabla 
    Number=ghfh 
    PAR=sdfsdfs 
    PAR=fgfgfg 
... 

非常感謝!

+0

我想我會嘗試XSLT轉換,但要清楚我想要實現的是我希望得到的XML是這樣的: ... – szymon

回答

2

財產以後這樣的:

<xsl:for-each select="//Port"> 
    <xsl:copy-of select="*[name()='ID' or name()='Name' or name()='Number']"></xsl:copy-of> 
    <xsl:copy-of select="Section/*[name()='PAR']"></xsl:copy-of> 
</xsl:for-each> 

希望有所幫助。 :)

問候, 的Harrie

+0

我的例子的結果應該也是XML。我編寫它的方式只是關於層次結構應該如何的概述。結果應該是這樣的: ... – szymon

1

你要求什麼是不可能實現的一個XPath表達式。

XPath表達式選擇節點或節點集,因爲它存在於文檔中。如果您使用XPath選擇Port元素,那麼該元素將被修改並返回給您,並具有其所有現有文檔上下文,包括其父項和子項。

你可以獨立的Port選擇每個後代元素,採用了工會|,或者,你可以選擇每個Port元素,然後與每個Port爲背景,只選擇你要使用這些後代(或刪除/忽略你不想要的後代)。

如何做到這一點將取決於您在檢索節點時打算如何處理節點。如果您希望從輸入中生成示例輸出,那麼XSLT可能是一個不錯的選擇。