Va bene gente, ancora un'altra domanda XSLT. Questa trasformazione consiste in 2 azioni che ho lavorato individualmente in 2 diversi XSLT ma che non riesco a combinare.
Sto cercando di creare una trasformazione dell'identità che seleziona un set di nodi e rimuove anche tutti gli attributi. Ecco cosa sto lavorando con:
Dati:
<?xml version="1.0" encoding="utf-8"?>
<doc>
<meta>
<data>
<uselessMeta>SomeValue</uselessMeta>
</data>
</meta>
<dataWrapper>
<data xmlns:xfa="http://www.w3.org/1999/xhtml">
<neededData1 meanAttribute="NotWanted">TransformMe!</neededData1>
<neededData2 meanAttribute="NotWanted">TransformMe!</neededData2>
</data>
</dataWrapper>
</doc>
XSLT 1 (Identity Transform):
<?xml version="1.0" encoding="utf-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0" >
<xsl:output omit-xml-declaration="no" method="xml" indent="no"/>
<xsl:template match="/">
<xsl:copy>
<xsl:copy-of select="//dataWrapper/data[text() != ""]" />
</xsl:copy>
</xsl:template>
</xsl:transform>
XSLT 2: XSLT: rimuovi tutti gli attributi
Risultato ricercato:
<?xml version="1.0" encoding="utf-8"?>
<data xmlns:xfa="http://www.w3.org/1999/xhtml">
<neededData1>TransformMe!</neededData1>
<neededData2>TransformMe!</neededData2>
</data>
Il problema sembra essere che sto cercando di far corrispondere la radice (/
) o tutti i nodi (node()
) ma che non posso usare <xsl:copy-of />
e <xsl:apply-templates />
insieme. Cose da notare:
- Xalan (JDK 1.7)
- XSLT 1.0
Qualsiasi aiuto è molto apprezzato!
risposte:
1 per risposta № 1Invece di usare xsl:copy-of
nel tuo primo XSLT, tu xsl:apply-templates
che può quindi selezionare i modelli nel secondo XSLT (una volta combinato con il primo). xsl:copy-of
copia semplicemente il nodo esistente senza apportare modifiche o applicare altri modelli.
Prova questo XSLT:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
<xsl:output omit-xml-declaration="no" method="xml" indent="no"/>
<xsl:template match="/">
<xsl:copy>
<a>
<xsl:apply-templates select="//dataWrapper/data[text() != ""]" />
</a>
</xsl:copy>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*"/>
</xsl:transform>
Nota che ho rimosso la partita @*
dal modello di identità, quindi corrisponde solo node()
. Avere due modelli che corrispondono alla stessa cosa con la stessa priorità può essere sollevato come errore da alcuni processori, sebbene possano anche scegliere l'ultimo modello corrispondente. (Vedere http://www.w3.org/TR/xslt#conflict)