La modification d'une valeur de nom d'espace dans une transformation XSL?
Je ne suis pas sûr si c'est possible, comme je suis très nouveau pour XSLT et d'autres choses, mais peut-être que certains d'entre vous pourraient m'aider ici? C'est un peu délicat et je n'ai rien trouvé de semblable sur internet:
Le problème est que j'ai un xml d'entrée avec espaces de noms déclarés et tous, et j'ai seulement besoin d'effectuer de légères modifications (ajout ou suppression d'attributs ou de les déplacer vers d'autres endroits). Mais en même temps, je dois mettre à jour les références d'espace de noms dans le document de la balise du document. Ainsi, par exemple, l'entrée xml pourrait ressembler à quelque chose comme ceci:
<order
xmlns="some.url.01"
xmlns:ns2="some.other.url"
xmlns:ns3="another.one"
>
<orderEntry>
<orderControl>
<mandant>test</mandant>
<businessUnit>test</businessUnit>
<inboundChannel>test</inboundChannel>
<timestamp>timestamp</timestamp>
<requestedDocuments>
<ns2:document>orderForm</ns2:document>
</requestedDocuments>
</orderControl>
</orderEntry>
</order>
le xml résultant devrait ressembler à ceci:
<order
xmlns="some.url.02"
xmlns:ns2="some.other.url.02"
xmlns:ns3="another.one.02"
>
<orderEntry>
<orderControl>
<mandant>test</mandant>
<businessUnit>test</businessUnit>
<inboundChannel>test</inboundChannel>
<!-- deleted timestamp for example -->
<requestedDocuments>
<ns2:document>orderForm</ns2:document>
</requestedDocuments>
</orderControl>
</orderEntry>
</order>
mais la seule chose que j'obtiens est:
<order
xmlns="some.url.02"
>
<orderEntry>
<orderControl>
<mandant>test</mandant>
<businessUnit>test</businessUnit>
<inboundChannel>test</inboundChannel>
<!-- deleted timestamp for example -->
<requestedDocuments>
<ns2:document xmlns:ns2="some.other.url.02">orderForm</ns2:document>
</requestedDocuments>
</orderControl>
</orderEntry>
</order>
Maintenant, peut-être pour l'une ou les deux de vous il ne pourrait pas être un gros problème, mais j'ai la restriction que le document de sortie devrait ressembler à un-à-un le même que le document d'entrée, sauf pour les demandes de modifications (changements de noms et de suppression).
Mon XSLT ressemble un comme ceci:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="some.url.02"
xmlns:ns2="some.other.url.02"
xmlns:ns3="another.one.02"
>
<xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="name(.) != 'timestamp'">
<xsl:element name="{node-name(.)}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{node-name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Quelqu'un peut-il aider s'il vous plaît? Les espaces de noms sont difficiles 🙁
P. S.: celui qui a édité mon entrée: Merci 🙂
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir l'espace de noms sur la sortie de l'élément avec l'attribut namespace:
Noter que l'espace de noms doit être un URI et bien que je pense que vous savez ce que c'est probablement une bonne idée d'utiliser des Uri dans votre exemple.
Voici un lien vers l'excellent ZVON tutoriel qui a travaillé exemples:
http://www.zvon.org/xxl/XSLTreference/Output/xslt_element_namespace.html
Je suis d'accord que les espaces de noms sont difficiles. Comme vous le savez, le préfixe est pas pertinent du point de vue sémantique, mais de nombreux systèmes permettent de choisir le préfixe pour des raisons esthétiques. Aussi regarder Saxon (http://saxon.sourceforge.net/)
MODIFIER je pense que vous trouverez votre réponse ici:
XSLT balise racine de l'espace de noms au lieu d'attribut d'élément de l'espace de noms
<xsl:variable/>
et de l'utiliser commenamespace="{$uri}"
. C'est très bien si vous avez besoin de lui plus souvent.De sortie:
Recherche d'un élément dans l'espace de noms avec le préfixe
a
et le remplace par un élément avec le même nom d'espace de nomshttp://example.com/B
. Tous les attributs sont copiés "tel quel" et puis tous les enfants sont évalués.Ajouter votre traitement personnalisé dans ou autour de celui que nécessaire.
Êtes-vous à l'aide de la Fourmi XSLT tâche de faire votre transformation?
Si la réponse est oui, vous pouvez passer de la valeur par défaut de moteur XSLT qui vient avec Sun JDK 1.5+. Lire ce.
Également lire cet article sur les espaces de noms XSLT