views:

24

answers:

1

Hello all

I have the following 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>

which I want to become:

<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>

since I need to remove every <giro> node whose <nombreGiro> is empty

What's the best way to do it by using XSLT?
Thank you in advance

+2  A: 

Use:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
 <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>

when this transformation is applied on the provided XML document:

<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>

the wanted, correct result is produced:

<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>
Dimitre Novatchev
Thank you, it's just what I needed
azathoth
@Dimitre: +1 Good answer. You could also use `<xsl:template match="giro[nombreGiro[not(node())]]"/>`
Alejandro