Lavorando coi parser xml di java 1.4 spesso mi è più facile fare una pulizia preliminare del file, così ho messo a punto questo xsl che fa le seguenti operazioni:
- elimina i namespaces: anche se non è cosa buona e giusta in molti casi mi semplifica il lavoro (col rischio di toppare qualcosa però, con gli input esterni, che valido prima via xsd però)
- normalizza gli spazi: toglie gli spazi intorno al testo contenuto nei tags
- elimina i tag vuoti ricorsivamente
Un esempio di trasformazione, con questo input:
<person xmlns:xsi="ciao">
<name>
mickey mouse
</name>
<age></age>
<sex>M</sex>
<unspec/>
<ricor>
<test><toast/><toaster/></test> </ricor>
<test xsi:type="dmnd:Prot">
<toaster/>
</test>
</person>
Ottengo questo output:
<person>
<name>mickey mouse</name>
<sex>M</sex>
<test type="dmnd:Prot"/>
</person>
Questo è il sorgente dell'xsl:
<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="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)" />
</xsl:template>
<xsl:template match="*[not(descendant-or-self::*[text()[normalize-space()] | @*])]" />
</xsl:stylesheet>