2009-06-11 6 views
4

A partir d'un XML avec un espace de noms par défaut:Contourner namespaces lors de la copie d'un fichier XML avec XSLT

<Root> 
    <A>foo</A> 
    <B></B> 
    <C>bar</C> 
</Root> 

J'applique un XSLT pour supprimer l'élément 'C':

<?xml version="1.0" ?> 

<xsl:stylesheet version="2.0" xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="html" indent="no" encoding="utf-8" /> 

<xsl:template match="*"> 
     <xsl:copy> 
       <xsl:copy-of select="@*" /> 
       <xsl:apply-templates /> 
     </xsl:copy> 
</xsl:template> 

<xsl:template match="C" /> 

</xsl:stylesheet> 

et je finissent par avec le code XML suivant (il est normal d'avoir « B » n'effondré parce que je suis en utilisant HTML comme méthode de sortie):

<Root> 
    <A>foo</A> 
    <B></B> 
</Root> 

Mais si I e ver obtenir un autre XML, cette fois avec un espace de noms:

<Root xmlns="http://company.com"> 
    <A>foo</A> 
    <B></B> 
    <C>bar</C> 
</Root> 

l'élément 'C' n'est pas supprimé après le processus XSLT.

Que puis-je faire pour ignorer cet espace de noms, existe-t-il un moyen?

+0

Quelle est la raison de déclarer l'espace de noms "http://www.w3.org/1999/XSL/Transform" deux fois dans votre ? La déclaration d'espace de noms par défaut doit être supprimée, à mon humble avis. – Tomalak

+0

Il n'y a pas de raison en fait, ma mauvaise. –

Répondre

9

Pas si recommandable, mais fonctionne:

<xsl:template match="*[local-name()='C']" /> 

Mieux:

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:foo="http://company.com" 
    exclude-result-prefixes="foo" 
> 

    <!-- ... --> 

    <xsl:template match="C | foo:C" /> 

    <!-- ... --> 

</xsl:stylesheet> 
+0

Super! Merci beaucoup, ça marche :-) –

+0

Je débattrais de la partie "pas si recommandable", mais je ne veux pas recommencer tout ça :) – annakata

+0

@annakata: Je sais. :-) Mais je suis d'accord avec la première approche. Je dis juste que le second est plus propre. Et fonctionne mieux, probablement. ;-) – Tomalak

Questions connexes