Comment remplacer le préfixe d'espace de noms d'éléments et d'attributs à l'aide de xslt
J'ai une source xml comme suit:
<SampleRequest xmlns="http://sample.com/s"
xmlns:s1="http://sample.com/s1"
xmlns:s2="http://sample.com/s2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://sample.com/s schema.xsd">
<data>
<s1:customer s1:firstName="Jim" s1:lastName="Ellison"/>
<s2:address>
123 test street
</s2:address>
</data>
</SampleRequest>
J'ai besoin de le transformer à la suite de
<SampleRequest xmlns="http://sample.com/t"
xmlns:t1="http://sample.com/t1"
xmlns:t2="http://sample.com/t2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://sample.com/t targetSchema.xsd">
<data>
<t1:customer t1:firstName="Jim" t1:lastName="Ellison"/>
<t2:address>
123 test street
</t2:address>
</data>
</SampleRequest>
les deux xmls schéma identique mais différent de l'espace de noms.
J'ai essayé d'utiliser la suite xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://sample.com/s"
xmlns:s1="http://sample.com/s1"
xmlns:s2="http://sample.com/s2"
xmlns:t1="http://sample.com/t1"
xmlns:t2="http://sample.com/t2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="s1 s2">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<SampleRequest xmlns="http://sample.com/t"
xmlns:t1="http://sample.com/t1"
xmlns:t2="http://sample.com/t2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">
http://sample.com/t targetSchema.xsd
</xsl:attribute>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</SampleRequest>
</xsl:template>
<xsl:template match="s1:*">
<xsl:element name="t1:{local-name()}" namespace="http://sample.com/t1">
<xsl:apply-templates select="* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="s2:*">
<xsl:element name="t2:{local-name()}" namespace="http://sample.com/t2">
<xsl:apply-templates select="* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Et j'obtiens le résultat suivant
<?xml version="1.0" encoding="UTF-8"?><SampleRequest xmlns="http://sample.com/t" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t2="http://sample.com/t2" xmlns:t1="http://sample.com/t1" xsi:schemaLocation=" http://sample.com/t targetSchema.xsd">
<t1:customer/>
<t2:address>
123 test street
</t2:address>
</SampleRequest>
Il semble que tous les attributs sont manquantes.
Je suis très nouveau à XSLT, chaque petit aide appréciée
OriginalL'auteur user1329164 | 2012-04-12
Vous devez vous connecter pour publier un commentaire.
Il y a deux problèmes dans votre XSLT. Tout d'abord, lorsque vous comparez les s1 et s2 éléments, vous n'êtes pas par la suite en essayant d'appliquer des modèles pour tous les attributs. Vous devez remplacer cette déclaration
Avec cette déclaration
Deuxièmement, vous n'avez pas de modèles pour correspondre à de tels attributs. Vous avez besoin d'un modèle comme suit:
Essayer cette XSLT
Lorsqu'il est appliqué à votre XML exemple, la suite est sortie:
OriginalL'auteur Tim C