2017-04-19 40 views
-1
<root> 
<xnode> 
    <Node1/> 
    <Node2/> 
    <Node3> 
     <CNode1> 
     <CCNode1> 
      <CCField1> 
      <CCField2> 
       <CCCNode1/> 
      </CCNode1> 
     <CCNode2> 
      <CCCNode3/> 
    </Node3> 

     <Node4/> 
</xnode> 
<xnode> 
    <Node1/> 
    <Node2/> 
    <Node3> 
     <CNode1> 
      <CCNode2> 
      <CCCNode3/> 
    </Node3> 
     <Node4/> 
    </xnode> 
    <xnode> 
    <Node1/> 
    <Node2/> 
    <Node3> 
     <CNode1> 
     <CCNode1> 
      <CCField1> 
      <CCField2> 
       <CCCNode1/> 
      </CCNode1> 
     <CCNode2> 
      <CCCNode3/> 
     </Node3> 
     <Node4/> 
    </xnode> 
</root> 

在上面的xml中,我需要複製除節點3 - CNode1 - CCNode1以外的所有節點和值。即如果CCNode1存在拷貝作爲包括子元素的拷貝,如果不包含,則創建具有相應字段和子元素的CCNode1。對於前者,這裏第一個和第三個x節點具有CCNode1,而在第二個x節點中缺少它。因此,請複製第一個和第三個node1,並在第二個xnode中使用一些虛擬值創建CCNode1及其子元素。xslt複製深xml如果存在,如果不創建

請建議如何使用XSLT實現此目標。

感謝

+0

您的XML示例結構不正確。例如,您的Node3標籤未關閉。所以,我建議修復你的輸入XML並提供輸出XML。 – Bluewood66

+0

對不起,編輯時錯過了,現在更新了。 – tsjo

回答

0

所以,我可以告訴最好的是,你需要一個身份模板複製的一切。然後,您需要一個類似以下的模板來選擇沒有CCNode1節點的Node3/CNode1節點。在那裏你可以添加你的節點。

<xsl:template match="Node3/CNode1[not(.//CCNode1)]"> 
    <xsl:copy> 

    Add your ccNode1 and child nodes here. 

    <!-- Output other child nodes of CNode1 --> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<!-- Identity. --> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
+0

謝謝。它的工作原理,但我想如果我可以改變我的實施。如果CCNode1不存在或者存在CCField1的值爲0,但將文件的其餘部分按原樣複製,是否可以刪除整個xnode(包含所有子節點)? – tsjo

+0

只需添加一個模板即可選擇符合您條件的xnode。那麼不要在模板內做任何事情。這會壓制。即。 您可以使用XPath來滿足您的需求。 – Bluewood66

+0

我已經試過了,但它仍然在複製父節點,我不需要它。即仍然被複制。我需要整個xnode和子節點不被複制。請建議。謝謝 – tsjo