2012-08-08 13 views
5

tengo XMLXSLT eliminar elementos no deseados

<getInquiryAboutListReturn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <inquiryAbouts> 
     <inquiryAbout> 
      <code>Code</code> 
      <nameKk>Something</nameKk> 
      <nameRu>Something</nameRu> 
      <documents xsi:nil="true"/> 
     </inquiryAbout> 
    </inquiryAbouts> 
</getInquiryAboutListReturn> 

Y quiero procesarlo con XSLT para copiar todos XML

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes" /> 
    <xsl:template match="/"> 
     <xsl:copy-of select="//getInquiryAboutListReturn/inquiryAbouts"/> 
    </xsl:template> 
</xsl:stylesheet> 

¿Cómo podría copiar todos XML sin <documents xsi:nil="true"/> o sin xsi: nil = "verdadero"?

salida deseada XML

<getInquiryAboutListReturn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <inquiryAbouts> 
     <inquiryAbout> 
      <code>Code</code> 
      <nameKk>Something</nameKk> 
      <nameRu>Something</nameRu> 
     </inquiryAbout> 
    </inquiryAbouts> 
</getInquiryAboutListReturn> 
+1

¿Solo desea que se omitan los , o todos los elementos con @xsi: nil = "true"? Puede ser útil si publica su salida xml esperada. –

+0

Quiero omitir todos los elementos con @xsi: nil = "true". – Eldar

Respuesta

7

Este sencillo XSLT:

<?xml version="1.0"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    version="1.0"> 

    <xsl:output omit-xml-declaration="no" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!-- TEMPLATE #1 --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- TEMPLATE #2 --> 
    <xsl:template match="*[@xsi:nil = 'true']" /> 

</xsl:stylesheet> 

... cuando se aplica a XML de origen de la OP:

<?xml version="1.0"?> 
<getInquiryAboutListReturn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <inquiryAbouts> 
    <inquiryAbout> 
     <code>Code</code> 
     <nameKk>Something</nameKk> 
     <nameRu>Something</nameRu> 
     <documents xsi:nil="true"/> 
    </inquiryAbout> 
    </inquiryAbouts> 
</getInquiryAboutListReturn> 

... produce el resultado esperado XML:

<?xml version="1.0"?> 
<getInquiryAboutListReturn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <inquiryAbouts> 
    <inquiryAbout> 
     <code>Code</code> 
     <nameKk>Something</nameKk> 
     <nameRu>Something</nameRu> 
    </inquiryAbout> 
    </inquiryAbouts> 
</getInquiryAboutListReturn> 

EXPLICACIÓN:

  1. La primera plantilla - los Identity Template - copia todos los nodos y atributos del documento XML de origen tal cual .
  2. La segunda plantilla, que coincide con todos los elementos con el atributo de espacio de nombres especificado que equivale a "verdadero", elimina de forma efectiva esos elementos.
+1

Quiere todos los elementos con @xsi: nil = verdadero omitido, no solo los elementos del documento. –

+1

Gracias, @ColinD - Actualizaré. – ABach

+0

Si agrega '', esto eliminará todo 'xsi: nil 'independientemente del valor verdadero o falso –

Cuestiones relacionadas