2009-11-06 5 views
0

Je dois ajouter un xmlns à l'élément racine dans la sortie de cette transformation XSLT. J'ai essayé ajouté <xsl:attribute name="xmlns"> mais il est interdit.XML et XSLT et définition de l'espace de noms

Quelqu'un at-il des idées pour résoudre ce problème?

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

    <xsl:template match="/"> 
      <xsl:variable name="rootElement" select="name(*)"/> 
      <xsl:element name="{$rootElement}"> 
       <xsl:apply-templates select="/*/*"/> 
      </xsl:element> 
    </xsl:template> 

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

</xsl:stylesheet> 

Répondre

2

Vous ne pouvez pas simplement "ajouter" un espace de noms, au moins pas dans XSLT 1.0. Les espaces de noms sont des propriétés fixes des noeuds d'entrée. Vous copiez le noeud, vous copiez également son espace de noms.

Cela signifie que vous devez créer nouveaux noeuds qui se trouvent dans l'espace de noms correct. Si vous ne voulez pas de préfixe, mais un espace de noms par défaut, la feuille de style XSL doit être dans le même espace de noms par défaut.

Ce qui suit applique l'espace de noms par défaut à tous les nœuds d'éléments et copie le reste:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://tempuri.org/some/namespace" 
> 

    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

tourne

<bla bla="bla"> 
    <bla /> 
</bla> 

à

<bla bla="bla" xmlns="http://tempuri.org/some/namespace"> 
    <bla></bla> 
</bla> 
4

De the XSLT 1.0 spec:

L'élément xsl:element permet à un élément à créer avec un nom calculé. Le nom étendu de l'élément à créer est spécifié par un attribut obligatoire name et un attribut facultatif namespace.

Vous devez déclarer le préfixe d'espace de nom que vous souhaitez utiliser sur votre élément xsl:stylesheet, puis spécifiez l'URI d'espace lorsque vous créez l'élément.

Pour illustrer, la feuille de style suivante:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:foo="http://example.com/foo"> 
    <xsl:template match="/"> 
    <xsl:element name="bar" namespace="http://example.com/foo">element</xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

produit la sortie:

<?xml version="1.0" encoding="UTF-8"?> 
<foo:bar xmlns:foo="http://example.com/foo">element</foo:bar> 
+1

Le problème est de savoir comment faire les nœuds ci-dessous utiliser le même espace de noms. – reinierpost

Questions connexes