2010-06-22 156 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