2008-09-27 8 views
10

J'ai un document XML avec des éléments non-namespaced, et je veux utiliser XSLT pour leur ajouter des espaces de noms. La plupart des éléments seront dans l'espace de noms A; quelques-uns seront dans l'espace de noms B. Comment est-ce que je fais ceci?Ajouter un espace de noms aux éléments

Répondre

13

Avec foo.xml

<foo x="1"> 
    <bar y="2"> 
     <baz z="3"/> 
    </bar> 
    <a-special-element n="8"/> 
</foo> 

et foo.xsl

<xsl:template match="*"> 
     <xsl:element name="{local-name()}" namespace="A" > 
      <xsl:copy-of select="attribute::*"/> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="a-special-element"> 
     <B:a-special-element xmlns:B="B"> 
      <xsl:apply-templates match="children()"/> 
     </B:a-special-element> 
    </xsl:template> 

</xsl:transform> 

Je reçois

<foo xmlns="A" x="1"> 
    <bar y="2"> 
     <baz z="3"/> 
    </bar> 
    <B:a-special-element xmlns:B="B"/> 
</foo> 

Est-ce que vous cherchez?

+0

Yup; J'ai googlé une réponse avant votre poste, et c'était essentiellement la même chose. La seule différence est que j'utilise à la place, mais je crois qu'ils sont fonctionnellement identiques. –

0

Voici ce que j'ai jusqu'à présent:

<xsl:template match="*"> 
    <xsl:element name="{local-name()}" namespace="A" > 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="a-special-element"> 
    <B:a-special-element xmlns:B="B"> 
     <xsl:apply-templates /> 
    </B:a-special-element> 
</xsl:template> 

Cela fonctionne presque; le problème est qu'il ne copie pas les attributs. D'après ce que j'ai pu lire, xsl: element n'a pas le moyen de copier tous les attributs de l'élément tel qu'il est (use-attribute-sets ne semble pas le couper).

+1

Vous n'avez pas lu la bonne documentation. Utilisez la force, lisez la spécification, c'est très bien écrit et accessible. – ddaa

2

Vous aurez besoin de deux ingrédients principaux pour cette recette.

Le stock de sauce sera le identity transform, et l'attribut principal sera donné par l'attribut namespace à xsl:element.

Le code suivant, non testé, doit ajouter l'espace de noms http://example.com/ à tous les éléments.

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

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

Message personnel: Bonjour, Jeni Tennison. Je sais que vous lisez ceci.