/ / Comment ajouter un espace de noms à tous les éléments d'un nœud? - xslt

Comment ajouter un espace de noms à tous les éléments d'un nœud? - xslt

Supposons que j'ai du xml:

<a>
<b>something</b>
<c>something</c>
<d>something</d>
</a>

et je veux que tous les enfants de <a> être préfixé avec le x espace de noms. Actuellement, j'ai ce qui suit pour y parvenir:

<xsl:template match="a">
<a>
<xsl:apply-templates>
</a>
</xsl:template>

<xsl:template match="b">
<x:b><xsl:value-of select="." /></x:b>
</xsl:template>

<xsl:template match="c">
<x:c><xsl:value-of select="." /></x:c>
</xsl:template>

<xsl:template match="d">
<x:d><xsl:value-of select="." /></x:d>
</xsl:template>

Cela fonctionne, mais c'est lourd et je dois savoir quels sont les noms de tous les enfants. Je connais le match="*" syntaxe mais je ne sais pas comment obtenir le nom de quoi que ce soit * est que je puisse faire précéder la x dans la correspondance du modèle. Des idées?

Pour être clair, j'espère remplacer ceux xsl:template nœuds avec un seul nœud qui préfixera le nom du nœud avec un contenant le x espace de noms.

Réponses:

2 pour la réponse № 1

Que diriez-vous de ce XSLT?

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns:x="mynamespace"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" />

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

</xsl:stylesheet>

2 pour la réponse № 2

utilisation local-name(.) pour obtenir le nom local (c'est-à-dire le nom sans espace de noms) d'un nœud, et xsl:element pour créer un élément avec ce nom. Utilisation name(.) pour les attributs. L'application est quelque chose comme ça:

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

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

<xsl:template match="@*">
<xsl:attribute name="{name(.)}"><xsl:value-of select="."/></xsl:attribute>
</xsl:template>

</xsl:stylesheet>

EDIT: ajouter un modèle d'attribut.