/ / XSLT Identity Transformation durante la rimozione di tutti gli attributi - xml, xslt, xslt-1.0, xalan

Trasformazione identità XSLT durante la rimozione di tutti gli attributi - xml, xslt, xslt-1.0, xalan

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

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