2009-06-17 8 views
0

J'ai un document XML avec de nombreux espaces de noms différents en cours d'utilisation et un schéma à valider. Le schéma exige que tous les éléments soient "qualifiés", et je suppose que cela signifie qu'ils doivent avoir des QNames complets sans espace de noms nul.Sélection de noeuds avec l'espace de noms par défaut

Cependant, certains éléments de ce document XML géant se sont glissés en utilisant uniquement l'espace de noms par défaut, qui dans le cas de ce document est vide. En général, ils échouent à la validation avec le schéma. J'essaye d'écrire un XSLT qui sélectionnera des noeuds qui n'ont aucun espace de nom et leur assignera un spécifique avec le même préfixe que les autres. Par exemple:

<x:doc xmlns:x="http://thisns.com/"> 
    <x:node @x:property="true"> 
    this part passes validation 
    </x:node> 
    <node property="false"> 
    this part does not pass validation 
    </node> 
</x:doc> 

J'ai essayé d'ajouter xmlns="http://thisns.com/" au nœud racine du document, mais cela ne concorde pas avec le schéma validateur. Des pensées sur comment je peux faire ce travail?

Merci!

Répondre

2
<!-- Identity transform by default --> 
<xsl:template match="node() | @*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
</xsl:template> 
<!-- Override identity transform for elements with blank namespace --> 
<xsl:template match="*[namespace-uri() = '']">  
    <xsl:element name="{local-name()}" namespace="http://thisns.com/"> 
    <xsl:apply-templates select="node() | @*"/> 
    </xsl:element> 
</xsl:template> 
<!-- Override identity transform for attributes with blank namespace --> 
<xsl:template match="@*[namespace-uri() = '']"> 
    <xsl:attribute name="{local-name()}" namespace="http://thisns.com/"><xsl:value-of select="."/></xsl:attribute> 
</xsl:template> 

Cela donnera un résultat similaire à:

<x:doc xmlns:x="http://thisns.com/"> 
    <x:node x:property="true"> 
    this part passes validation 
    </x:node> 
    <node xp_0:property="false" xmlns="http://thisns.com/" xmlns:xp_0="http://thisns.com/"> 
    this part does not pass validation 
    </node> 
</x:doc> 

Notez que le deuxième noeud < > est toujours sans préfixe d'espace de noms, mais il est maintenant considéré comme faisant partie du même espace en raison des xmlns = attribut.

Questions connexes