2010-06-22 88 views
1

我有一個巨大的XML,我需要處理,但我只需要根中的幾個節點。問題是,在那個節點中,我得到了一個需要刪除的孩子。任何人都在意解釋這是否可行,如果是的話,該怎麼辦? 這是XML的樣本,我得到:如何從XML複製節點而不使用XSLT複製該節點的子節點?

<XML> 
<Properties> 
    Contend 
</Properties> 
<Events> 
    Contend 
</Events> 
<Contracts> 
    Contend 
</Contracts> 
<Trades> 
    Contend 
</Trades> 
<Deals> 
    <Deal> 
    <Edition> 
    <Object> 
    <Values> 
     <Value>N</Value> 
     <Value>N</Value> 
    </Values> 
    </Object> 
    <Members> 
    <memberValue> 
     <member>template</member> 
     <member>template</member> 
     <member> 
     <Object> 
     <Flows> 
     <Cupom> 
      <Period> 
      <Calculation> 
      <Data>N</Data> 
      <Data>N</Data> 
      <Rate> 
      <Data>N</Data> 
      <Data>N</Data> 
      <observations> 
       Tons of Contend 
      </observations> 
      </Rate> 
      </Calculation> 
      </Period> 
     </Cupom> 
     <Cupom> 
      <Period> 
      <Calculation> 
      <Data>N</Data> 
      <Data>N</Data> 
      <Rate> 
      <Data>N</Data> 
      <Data>N</Data> 
      <observations> 
       Tons of Contend 
      </observations> 
      </Rate> 
      </Calculation> 
      </Period> 
     </Cupom> 
     <Cupom> 
      <Period> 
      <Calculation> 
      <Data>N</Data> 
      <Data>N</Data> 
      <Rate> 
      <Data>N</Data> 
      <Data>N</Data> 
      <observations> 
       Tons of Contend 
      </observations> 
      </Rate> 
      </Calculation> 
      </Period> 
     </Cupom> 
     <Cupom> 
      <Period> 
      <Calculation> 
      <Data>N</Data> 
      <Data>N</Data> 
      <Rate> 
      <Data>N</Data> 
      <Data>N</Data> 
      <observations> 
       Tons of Contend 
      </observations> 
      </Rate> 
      </Calculation> 
      </Period> 
     </Cupom> 
     </Flows> 
     </Object> 
     </member> 
    </memberValue> 
    </Members> 
    </Edition> 
    </Deal> 
</Deals> 
</XML> 

我需要保存去節點,但是,裏面,我需要刪除一個。請注意,節點在每個節點中重複。所有這些都必須刪除。

最後,我的XML shoul'd看起來像這樣:

<XML> 
<Deals> 
    <Deal> 
    <Edition> 
    <Object> 
    <Values> 
     <Value>N</Value> 
     <Value>N</Value> 
    </Values> 
    </Object> 
    <Members> 
    <memberValue> 
     <member>template</member> 
     <member>template</member> 
     <member> 
     <Object> 
     <Flows> 
     <Cupom> 
      <Period> 
      <Calculation> 
      <Data>N</Data> 
      <Data>N</Data> 
      <Rate> 
      <Data>N</Data> 
      <Data>N</Data> 
      </Rate> 
      </Calculation> 
      </Period> 
     </Cupom> 
     <Cupom> 
      <Period> 
      <Calculation> 
      <Data>N</Data> 
      <Data>N</Data> 
      <Rate> 
      <Data>N</Data> 
      <Data>N</Data> 
      </Rate> 
      </Calculation> 
      </Period> 
     </Cupom> 
     <Cupom> 
      <Period> 
      <Calculation> 
      <Data>N</Data> 
      <Data>N</Data> 
      <Rate> 
      <Data>N</Data> 
      <Data>N</Data> 
      </Rate> 
      </Calculation> 
      </Period> 
     </Cupom> 
     <Cupom> 
      <Period> 
      <Calculation> 
      <Data>N</Data> 
      <Data>N</Data> 
      <Rate> 
      <Data>N</Data> 
      <Data>N</Data> 
      </Rate> 
      </Calculation> 
      </Period> 
     </Cupom> 
     </Flows> 
     </Object> 
     </member> 
    </memberValue> 
    </Members> 
    </Edition> 
    </Deal> 
</Deals> 
</XML> 

非常感謝任何人,可以幫助。

乾杯!

+1

編輯您的問題並重新標記您的文檔樣本。 – 2010-06-22 20:55:21

+0

好問題(+1)。以XSLT解決方案的精神完整地查看我的答案。我還格式化了您的XML文檔,以便在重新掃描時可見。 – 2010-06-22 23:09:40

+0

代碼的格式不合適?對不起,如果是。我將閱讀發佈規則和新手技巧。許多坦克的答案。 – 2010-06-23 13:09:12

回答

1

這種轉變:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="/*/*[not(self::Deals)] | Cupom/*/*/*/observations"/> 
</xsl:stylesheet> 

當對所提供的XML文檔進行,產生所需的結果。

+0

好的答案和良好的編輯!另外,我沒有看到其他'觀察'元素。我想表達式'Cupom/*/*/* /觀察'是爲了清楚。 – 2010-06-22 23:21:03

+0

@亞歷山大,是的,它可能只是'匹配=「意見」' - 我只是沒有時間仔細檢查完整的大文件。 :) – 2010-06-23 00:44:31