2010-09-01 107 views
8

我有以下XML:删除XML节点时,子节点满足一定的要求

<listaGiros> 

    <giro> 
     <idGiro type="int">89</idGiro> 
     <nombreGiro type="varchar">foo</nombreGiro> 
    </giro> 

    <giro> 
     <idGiro type="int">78</idGiro> 
     <nombreGiro type="varchar">apple</nombreGiro> 
    </giro> 

    <giro> 
     <idGiro type="int">10</idGiro> 
     <nombreGiro type="varchar"/> 
    </giro> 
</listaGiros> 

,我想成为:

<listaGiros> 

    <giro> 
     <idGiro type="int">89</idGiro> 
     <nombreGiro type="varchar">foo</nombreGiro> 
    </giro> 

    <giro> 
     <idGiro type="int">78</idGiro> 
     <nombreGiro type="varchar">apple</nombreGiro> 
    </giro> 

</listaGiros> 

,因为我需要删除每<giro>节点,其<nombreGiro>是空的

使用XSLT的最佳方式是什么?
预先感谢您

回答

10

使用

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" 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="giro[not(nombreGiro/text())]"/> 
</xsl:stylesheet> 

当这种转变是在所提供的XML文档应用:

<listaGiros> 
    <giro> 
     <idGiro type="int">89</idGiro> 
     <nombreGiro type="varchar">foo</nombreGiro> 
    </giro> 
    <giro> 
     <idGiro type="int">78</idGiro> 
     <nombreGiro type="varchar">apple</nombreGiro> 
    </giro> 
    <giro> 
     <idGiro type="int">10</idGiro> 
     <nombreGiro type="varchar"/> 
    </giro> 
</listaGiros> 

想要的,正确的结果产生

<listaGiros> 
    <giro> 
     <idGiro type="int">89</idGiro> 
     <nombreGiro type="varchar">foo</nombreGiro> 
    </giro> 
    <giro> 
     <idGiro type="int">78</idGiro> 
     <nombreGiro type="varchar">apple</nombreGiro> 
    </giro> 
</listaGiros> 
+0

谢谢,这正是我所需要的 – azathoth 2010-09-01 17:10:21

+0

+1好答案。你也可以使用'' – 2010-09-01 18:23:56