2010-09-01 81 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