2010-05-22 16 views
8

ho bisogno di trasformare il seguente codice XML doc:XSLT: nodo di cambiamento testo interno

<a> 
    <b/> 
    <c/> 
    myText 
</a> 

in questo:

<a> 
    <b/> 
    <c/> 
    differentText 
</a> 

Così, ho scritto questo documento XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="no" /> 

    <xsl:template match="https://stackoverflow.com/a/text()"> 
    <a> 
     <b/> 
     <c/> 
     differentText 
    </a> 
</xsl:template> 
</xsl:stylesheet> 

Questo modo, ottengo il seguente risultato:

<?xml version="1.0" encoding="utf-8"?> 
<a> 
    <b /><c /> 
    differentText 
</a> 
<a> 
    <b /><c /> 
    differentText 
</a> 
<a> 
    <b /><c /> 
    differentText 
</a> 

Il risultato appare ripetuto 3 volte perché si stanno facendo 3 fiammate .. Perché? Potrei sistemarlo? Grazie

+0

Buona domanda (+1). Vedi la mia risposta per una soluzione migliore e più semplice, che non richiede alcun predicato nell'espressione di corrispondenza del modello specifico. –

risposta

8

Escludere i nodi di testo whtespace-only. Conoscere e utilizzare l'istruzione <xsl:strip-space>.

Questa trasformazione:

<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="a/text()"> 
    <xsl:text>Diferent text</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

quando applicato al documento XML fornito, produce il risultato corretto voluto.

Nessuna necessità di predicati complicati nell'espressione di corrispondenza del modello specifico!

Dovremmo sforzarci per la soluzione più semplice, più breve, più elegante, più leggibile e più comprensibile che sfrutti tutta la potenza del linguaggio.

È probabile che tale soluzione sarà compresa, più facile da implementare e molto probabilmente ottimizzata da qualsiasi processore XSLT, risultando in un'implementazione più efficiente.

+0

BTW, non considero '[normalize-space()! = '']' Un predicato particolarmente complicato. ;) – Tomalak

+0

@Tomalak: dovremmo sforzarci per la soluzione più semplice, più breve, più elegante, più leggibile e più comprensibile che sfrutti tutta la potenza del linguaggio. È probabile che tale soluzione sarà compresa, più facile da implementare e molto probabilmente ottimizzata da qualsiasi processore XSLT, risultando in un'implementazione più efficiente. :) –

6

Ci sono tre partite, come evidenziato da parentesi quadre:

<a>[ 
    ]<b/>[ 
    ]<c/>[ 
    myText 
]</a> 

si desidera qualcosa di simile:

<xsl:template match="https://stackoverflow.com/a/text()[normalize-space() != '']"> 
+0

Come mostrato nella mia risposta, non sono necessari predicati nell'espressione di corrispondenza. :) –

+4

@Dimitre: lo so. La mia risposta fornisce la minima modifica possibile al codice esistente. Si basa sul presupposto che il codice reale sia più complesso e '' possa causare effetti collaterali in altri luoghi. – Tomalak

+0

@Tomalak: Supponendo che cosa l'OP non ha detto spesso rende la soluzione subottimale e più difficile da capire, anche confusa. Andando in questo modo potremmo finire a dire tutto ciò che sappiamo su XSLT - "nel caso in cui ..." :) –

Problemi correlati