Supprimer une xmlns à partir de l'élément racine xml
Je suis en train de faire une transformation d'un document XML, mais je ne peux pas trouver une solution, car je ne sais pas XSLT.
J'ai le document XML:
<?xml version="1.0" encoding="UTF-8"?>
<addresses xmlns="http://www.test.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation='http://whatever/test.xsd'>
<address>
<name>Joe Tester</name>
<street>Baker street 5</street>
</address>
</addresses>
et je veux produire:
<?xml version="1.0" encoding="UTF-8"?>
<addresses xmlns="http://www.test.org/xml">
<address>
<name>Joe Tester</name>
<street>Baker street 5</street>
</address>
</addresses>
(Xsi:noNamespaceSchemaLocation="..." a déjà exclus à l'aide d'un autre XSLT avant celui-ci).
Quelqu'un peut m'aider à trouver une solution?
Le XSLT utilisé pour éliminer la xsi:noNamespaceSchemaLocation est:
<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 omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="@xsi:noNamespaceSchemaLocation"/>
</xsl:stylesheet>
Comment sur le calage hors de la catégorie "autres XSLT", a indiqué dans votre post pour éliminer les mauvais attribut?
La partie restante user466825 veut omettre est une déclaration d'espace de noms, pas un attribut.
La partie restante user466825 veut omettre est une déclaration d'espace de noms, pas un attribut.
OriginalL'auteur Fotinopoulos Giorgos | 2013-01-06
Vous devez vous connecter pour publier un commentaire.
Veuillez donner à ceci un essai:
Vous avez raison. Ian Roberts, la solution a été un pas de plus que la mienne, mais on dirait qu'il y avait toujours un de surveillance. Veuillez essayer l'approche modifiée ci-dessus.
OriginalL'auteur JLRishe
J'ai deux options:
XSLT1:
Output1:
XSLT2:
Output2:
Déclaration d'espace de noms, à la différence de tout autre attribut ne sera pas traitée normalement! Vous ne voulez pas que la déclaration soit il n'y en XML de sortie, mais, analyseur XSLT pense qu'il est nécessaire (car il est possible que vous pourriez avoir utilisé l'espace de noms comme préfixe de certains éléments dans votre XML!)
donc, soit vous devez vous débarrasser de xmlns à partir de votre ensemble de XML ou de se débarrasser d'un seul élément ou de l'attribut (ou de plusieurs) qui sont à l'aide que le préfixe d'espace de noms!
Option 2 xslt a fonctionné pour moi
OriginalL'auteur InfantPro'Aravind'
Votre problème est que lors de la copie d'un nœud d'élément
<xsl:copy>
implicitement des copies de l'espace de noms des nœuds qui sont dans la portée à ce point dans le document. Essayez d'ajouter un supplément de modèle pour les nœuds d'élément à exclure expressément lesxsi
espace de noms:Si votre
xsl:stylesheet
a unxmlns:xsi
ensuite, vous pouvez également trouver que vous devez ajouterexclude-result-prefixes="xsi"
comme suggéré dans cette réponse.Ce qui devrait éviter le xsi espace de noms n'apparaissent dans la sortie si c'est là uniquement parce qu'il a été copié à partir de l'entrée, bien que la serialiser peut ré-introduire, si nécessaire, pour rendre la sortie bien formé (c'est à dire si elle a besoin à la sortie d'un élément ou d'un attribut dans l'espace de nom).
self::xsi
est un test de nœud pour un élément nommé xsi.not(name() = 'xsi')
ounot(. = 'http://www.w3.org/2001/XMLSchema-instance')
devrait faire le travail.Je pense que vous avez besoin d'un modèle pour déposer
@xsi:noNamespaceSchemaLocation
.. sinon, la valeur affichée en sortie de l'orphelin, parce que vous êtes à l'aide de<xsl:apply-templates select="@*|node()"/>
sert de moi pour poster du code, je ne l'ai pas testé...
OP dit qu'ils avaient déjà retiré que dans une autre feuille de style.
oui, et de mon point est que la suppression de tous les de l'espace de noms n'est pas suffisante pour atteindre cet objectif, parce que
<xsl:copy>
des copies de l'espace de noms des nœuds (c'est à dire à la portée des déclarations de la source XML) avec l'élément qu'il est la copie. XSLT 2.0 permet<xsl:copy copy-namespaces="no">
mais ce n'est pas une option en XSLT 1.0.OriginalL'auteur Ian Roberts