19 mars 2003

Comment supprimer les espaces de noms dans un document XML ?

Les espaces de noms en XML sont pratiques, cependant dans certain cas, on s'en passerait bien. Surtout si, dans un même document, plusieurs parties sont définies par des espaces de noms différents.

Prenons l'exemple suivant :

<?xml version='1.0' encoding='utf-8'?>
<truc1 
 xmlns="http://www.exemple.com/truc1/">
 <test1>XXX</test1>
  <truc2 
   xmlns="http://www.exemple.com/truc1/">
   <test2>XXX</test2>
  </truc2>
  <truc3 
    xmlns="http://www.exemple.com/truc1/">
    <test3>XXX</test3>
  </truc3>
</truc1>    

Maintenant si on souhaite obtenir ce document :

<?xml version='1.0' encoding='utf-8'?>
<truc1>
 <test1>XXX</test1>
  <truc2>
   <test2>XXX</test2>
  </truc2>
  <truc3>
    <test3>XXX</test3>
  </truc3>
</truc1>

Il suffit d'appliquer la feuille xsl suivante. Celle-ci se chargera de supprimer les "namespaces".

<?xml version="1.0"?>
<xsl:stylesheet 
 version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output 
   omit-xml-declaration="yes" 
   method="xml" 
   indent="no"/>
  <xsl:template match="*">
    <xsl:element name="{name()}">
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>
  <xsl:template match="@*">
    <xsl:if test="local-name() = name()">
      <xsl:copy/>
    </xsl:if>
  </xsl:template>
  <xsl:template match="text()">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="comment()"/>
</xsl:stylesheet>

Aucun commentaire:

Enregistrer un commentaire