2011-10-13 16 views
7

vorrei rimuovere i tag che contengono solo caratteri spazi/a capo/tab, come di seguito:XPath/XSLT rimuovere i tag vuoti

<p> </p> 

Come si dovrebbe fare questo usando le funzioni di XPath e modelli XSLT?

+0

Buona domanda, +1. È possibile produrre correttamente il risultato desiderato utilizzando il modello di progettazione XSLT più fondamentale e potente, ignorando la regola dell'identità. –

risposta

10

Questa trasformazione (sovrascrivendo il identity rule):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output 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="*[not(*) and not(text()[normalize-space()])]"/> 
</xsl:stylesheet> 

quando applicato al seguente documento XML:

<t> 
<a> 
    <b> 
    <c/> 
    </b> 
</a> 
<p></p> 
<p> </p> 
<p>Text</p> 
</t> 

produce correttamente il risultato voluto:

<t> 
    <a> 
     <b/> 
    </a> 
    <p>Text</p> 
</t> 

Ricorda: l'utilizzo e l'override della regola di identità/modello è il modello di progettazione XSLT più fondamentale e potente. E 'la scelta giusta per una serie di problemi in cui la maggior parte dei nodi devono essere copiati invariato e solo alcuni nodi specifici devono essere alterati, cancellati, rinominati, ..., ecc

Nota: @Abel in il suo commento raccomanda che alcuni pezzi di questa soluzione devono essere ulteriormente spiegato:

per i non iniziati o curiose: not(*) mezzi: non avere un figlio elemento; not(text()[normalize-space()]) significa: non disporre di un nodo di testo con testo non solo bianco.

+4

Per i non iniziati o curiosi: 'non (*)' significa: non avere un elemento figlio; 'not (text() [normalize-space()])' significa: non ha un nodo di testo con testo. – Abel

+0

@Abel: Grazie, lo spiegherò nella risposta. –

+1

È grandioso, grazie Dimitre. Sono ancora un po 'un principiante con XSLT e continuo a scoprire cose come questa che mi fanno impazzire. Penso di aver bisogno di trovare un buon libro. Grazie ancora per la fantastica spiegazione, SO ha bisogno di più di questo. – Kyle

Problemi correlati