代码之家  ›  专栏  ›  技术社区  ›  azathoth

当子节点满足某些要求时删除XML节点

  •  8
  • azathoth  · 技术社区  · 16 年前

    我有以下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最好的方法是什么?
    提前谢谢你

    1 回复  |  直到 16 年前
        1
  •  11
  •   Dimitre Novatchev    16 年前

    使用 :

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