2 votes

Je veux ajouter l'attribut "xmlns" dans un fichier xml en utilisant xslt.

Je veux suivre la sortie du fichier xml :

<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1">
- <INTERFACE>
  <NAME>SAFER</NAME> 
  <VERSION>04.02</VERSION> 
  </INTERFACE>

Pour cela, j'ai le fichier xslt suivant :

<xsl:template match="T0020" >
    <xsl:copy>
    <xsl:attribute name="xsi:schemaLocation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd </xsl:attribute>

  //some code here...............//

 <xsl:copy>

J'ai donc ajouté l'attribut xmlns="http://www.safersys.org/namespaces/T0020V1" sous l'adresse suivante <T0020> taguer ?

2voto

Dimitre Novatchev Points 147842

Cette transformation :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vDefaultNS"
  select="'http://www.safersys.org/namespaces/T0020V1'"/>

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{$vDefaultNS}">
   <xsl:copy-of select="namespace::* | @*"/>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

lorsqu'il est appliqué à ce document XML :

<T0020 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd"
>
 <INTERFACE>
  <NAME>SAFER</NAME>
  <VERSION>04.02</VERSION>
 </INTERFACE>
</T0020>

produit le résultat souhaité :

<T0020 xmlns="http://www.safersys.org/namespaces/T0020V1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd">
   <INTERFACE>
      <NAME>SAFER</NAME>
      <VERSION>04.02</VERSION>
   </INTERFACE>
</T0020>

Prenez note que xmlns n'est pas un attribut, mais dénote une déclaration d'espace de nom.

1voto

Cette feuille de style :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="T0020">
        <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1">
            <xsl:attribute name="xsi:schemaLocation">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd</xsl:attribute>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Avec cette entrée :

<T0020>
    <INTERFACE>
        <NAME>SAFER</NAME>
        <VERSION>04.02</VERSION>
    </INTERFACE>
</T0020>

Sortie :

<T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1">
    <INTERFACE>
        <NAME>SAFER</NAME>
        <VERSION>04.02</VERSION>
    </INTERFACE>
</T0020>

Note : Les noeuds d'espace de nom ne sont pas des noeuds d'attributs. Si vous voulez que les éléments qui ne sont pas dans un espace de nom soient affichés dans un espace de nom, vous avez besoin de l'attribut xsl:element/@namespace .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X