2010-07-27 15 views
1

Je veux à suivre la sortie de fichier xml:Je veux ajouter l'attribut "xmlns" dans le fichier XML à l'aide xslt

<?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 que j'ai suivant fichier xslt:

<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> 

donc j'ajoute l'attribut xmlns = "http://www.safersys.org/namespaces/T0020V1" sous ?

+0

Bonne question (+1). Voir ma réponse pour une solution courte et simple. :) –

Répondre

1

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> 

Remarque: noeud Namespace sont des attributs non noeuds. Si vous voulez que les éléments d'un espace de noms ne soient pas sortis sous un espace de nom, vous avez besoin du xsl:element/@namespace.

+0

+1 pour une très bonne solution qui résout simplement le problème sans aucune digression. –

2

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é sur 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 recherché:

<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> 

Remarquez que xmlns n'est pas un attribut, mais une déclaration d'espace de noms.

+0

+1 pour une solution courte. Mais il semble que le fragment de feuille de style fourni ajoute une déclaration d'instance de schéma car peut-être avant il n'y avait pas de schéma. Cela pourrait aussi être la cause du changement d'espace de noms d'éléments. –

+0

@Alejandro: Je ne veux pas deviner ici. La question était "Comment ajouter xmlns" ... donc je montre juste ceci. –