2012-08-08 16 views
5

ho XMLXSLT rimuovere gli elementi indesiderati

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

E voglio elaborarlo con XSLT copiare tutti 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> 

Come potrei copiare tutte XML senza <documents xsi:nil="true"/> o senza xsi: nil = "true"?

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

Si desidera solo che sia omesso o tutti gli elementi con @xsi: nil = "true"? Potrebbe essere utile se pubblichi il tuo output xml previsto. –

+0

Voglio omettere tutti gli elementi con @xsi: nil = "true". – Eldar

risposta

7

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

... se applicato a XML fonte del PO:

<?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 il risultato atteso 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> 

SPIEGAZIONE:

  1. Il primo modello - i Identity Template - copia tutti i nodi e gli attributi del documento XML di origine così come sono .
  2. Il secondo modello, che corrisponde a tutti gli elementi con l'attributo specificato, namespaced uguale a "true", rimuove efficacemente quegli elementi.
+1

Vuole che tutti gli elementi con @xsi: nil = true ommitted, non solo elementi del documento. –

+1

Grazie, @ColinD - aggiornerò. – ABach

+0

Se aggiungi '', rimuoverà tutto 'xsi: nil 'indipendentemente dal valore vero o falso –

Problemi correlati