Question

Je souhaite créer l'élément suivant:

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd">

Si j'utilise quelque chose comme ceci:

<xsl:element name="excercises">
<xsl:attribute name="xmlns:xsi" namespace="http://www.w3.org/2001/XMLSchema-instance"/>

Ensuite, il crée quelque chose comme ceci:

<excercises xp_0:xsi="" xmlns:xp_0="http://www.w3.org/2001/XMLSchema-instance">

Ce qui ne ressemble pas à ce que je veux ...

Était-ce utile?

La solution

Essayez plutôt le suivant:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="xml">
        <xsl:element name="exercises">
            <xsl:attribute name="xsi:noNamespaceSchemaLocation">mySchema.xsd</xsl:attribute>
            some value
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

La principale préoccupation est de déclarer l'espace de noms xsi dans la déclaration.

Je viens juste de composer la correspondance de modèle juste pour tester.

Autres conseils

Voici comment cela peut être fait :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 exclude-result-prefixes="xsi">
    <xsl:output omit-xml-declaration="yes"/>
    <!--                                   -->
    <xsl:template match="/">
      <exercises  xsi:noNamespaceSchemaLocation="mySchema.xsd"/>
    </xsl:template>
</xsl:stylesheet>

Lorsque cette transformation est appliquée sur un document XML source (non utilisé), le résultat souhaité est généré:

<exercises xsi:noNamespaceSchemaLocation="mySchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

Il n'est pas nécessaire d'utiliser <xsl:attribute> dans votre cas . Toutefois, si nécessaire, il peut être utilisé sans problème:

    <xsl:attribute name="xsi:noNamespaceSchemaLocation">
      <xsl:value-of select="'mySchema.xsd'"/>
    </xsl:attribute>

Notez qu'il est judicieux de définir simplement les espaces de nom nécessaires au niveau de <xsl:stylesheet> l'élément afin qu'ils puissent être (ré) utilisés facilement partout où ils sont nécessaires. Cela est particulièrement utile si un espace de nom donné est requis pour plusieurs éléments ou attributs générés.

Dans ce cas, il convient également de spécifier tous ces préfixes dans la valeur de exclude-result-prefixes attribut afin que les espaces de noms ne soient pas automatiquement propagés sur tous les éléments de résultat littéraux.

Vous pouvez simplement utiliser: -

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd">

Directement dans votre XSL, cela fonctionnerait, vous n’avez vraiment besoin que de xsl: element si vous ne pouvez pas coder en dur le nom de la balise. De même avec les attributs, vous pouvez les ajouter directement, sauf si vous devez rendre conditionnel.

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