Question

J'ai un document XML avec des éléments non-nommés, et je souhaite utiliser XSLT pour leur ajouter des espaces de nom. La plupart des éléments seront dans l'espace de noms A; quelques-uns seront dans l'espace de noms B. Comment puis-je faire cela?

Était-ce utile?

La solution

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 ce que vous cherchez?

Autres conseils

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

Le stock de sauce sera la transformation d'identité et la saveur principale. sera attribué par l'attribut namespace à xsl: élément .

Le code non testé suivant doit ajouter l’espace de nom 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.

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 d'attributs. D'après ce que j'ai lu, xsl: element ne permet pas de copier tous les attributs de l'élément tel quel (use-attribut-ensembles ne semble pas le couper).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top