Comment éliminer xmlns=“” entrées produites par XSLT de transformation d'un document XML en un autre document XML
Ok, j'ai vu de nombreuses variations sur cette question, mais aucun n'est exactement la réponse que j'essaie de résoudre, et peut-être que je suis juste trop dense pour voir comment appliquer l'une des autres réponses à ce que je suis en train de faire.
J'ai un peu de XML qui ressemble à quelque chose comme:
<?xml version="1.0" encoding="utf-8"?>
<message>
<cmd id="api_info">
<api-version>1.0</api-version>
<api-build>1.0.0.0</api-build>
</cmd>
</message>
Maintenant, j'ai une transformation XSLT que j'ai demandé à ce XML. XSLT est semblable à la suivante:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
version="2.0">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="message"/>
</xsl:template>
<xsl:template match="message">
<xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001">
<xsl:apply-templates select="/message/cmd/@id"/>
</xsl:element>
</xsl:template>
<xsl:template match="/message/cmd/@id">
<xsl:variable name="_commandType" select="/message/cmd/@id"/>
<xsl:element name="messageHeader">
<xsl:element name="cmdType">
<xsl:value-of select="$_commandType"/>
</xsl:element>
</xsl:element>
<xsl:element name="messageBody">
<xsl:choose>
<xsl:when test="$_commandType = 'api_info'">
<xsl:element name="apiInfoBody">
<xsl:element name="apiVersion">
<xsl:value-of select="/message/cmd/api-version"/>
</xsl:element>
<xsl:element name="apiBuild">
<xsl:value-of select="/message/cmd/api-build"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="$_commandType = 'communicationError'">
<xsl:element name="communicationErrorBody">
<xsl:element name="errorCode">
<xsl:value-of select="error-code"/>
</xsl:element>
<xsl:element name="badCmd">
<xsl:value-of select="bad-cmd"/>
</xsl:element>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
La sortie que je reçois est, fondamentalement, ce que je veux et se présente comme suit:
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="http://www.companyname.com/schemas/product/Version001">
<messageHeader xmlns="">
<cmdType>api_info</cmdType>
</messageHeader>
<messageBody xmlns="">
<apiInfoBody>
<apiVersion>1.0</apiVersion>
<apiBuild>1.0.0.0</apiBuild>
</apiInfoBody>
</messageBody>
</message>
Mais je ne veux pas que sont le xmlns="" attributs dans le <messageHeader> et <messageBody> éléments.
Maintenant, j'ai trouvé que si je spécifier explicitement l'espace de noms XSLT pour ces éléments, l'indésirables attribut est poussé vers le bas d'un niveau pour les enfants de ces attributs.
Je pouvais juste aller à travers l'ensemble de mon XSLT et ajouter explicitement le xmlns=""http://www.companyname.com/schemas/product/Version001" l'attribut à chacun de mes xsl:element définitions, mais je sais qu'il doit y avoir une façon plus élégante. Nous les programmeurs sont trop paresseux pour ne pas avoir un raccourci pour ce genre de bêtises. Si mon XSLT n'était pas de quelque chose d'aussi simple que le raccourcissement de l'exemple, je être tenté de le faire de cette façon. Mais je sais qu'il doit y avoir une meilleure façon.
Personne ne sait ce que je suis en manque ici?
Merci,
AlarmTripper
OriginalL'auteur AlarmTripper | 2009-12-04
Vous devez vous connecter pour publier un commentaire.
Utiliser exclude-result-prefixes sur le xsl:stylesheet étiquette avec le préfixe "#default"
La référence du w3c pour ce qui est ICI
EDIT: OK, je devrais avoir étudié votre XSL avec plus de soin. Déplacer la xmlns sur le message de la balise jusqu'à la feuille de style de la balise. Cela permettra de mettre TOUS les éléments dans le même espace de noms et le résultat dans un espace de noms d'attribut sur le message de la balise. J'ai couru ce en Oxygène/XML et a obtenu le résultat que vous souhaitez.
Qui processeur XSLT utilisez-vous?
Oui, je confirme que votre nouvelle suggestion fonctionne aussi bien et qui est sans doute une meilleure solution que la mienne parce qu'elle maintient la xmlns affectation dans la feuille de style de l'élément. Et le #par défaut de l'option me permet de pas avoir à exclure tous les autres préfixes d'espace de noms. Merci beaucoup. J'ai beaucoup à apprendre sur ce XSLT trucs et je pense que les espaces de noms sont probablement l'un des aspects les plus délicats.
Je suis l'aide de Altova XMLSpy Professional. Juste acheté aujourd'hui pour aider à obtenir par le biais de certains de ces trucs.
Bienvenue à XSLT! Il y a beaucoup à apprendre, mais vous trouverez que c'est un environnement riche (surtout XSLT 2). Si vous ne l'avez pas déjà fait, obtenir une copie de Michael Kay, XSLT/XPATH 2.0 de référence (ISBN 0470192747 4ème édition avril 2008). J'utilise ma copie de tous les temps, et il va au-delà d'être une simple référence. Découvrez également les spec sur XSLT w3c.org. Il peut être intimidant, mais n'est pas difficile à lire et est le summum de la définition de ce XSLT est.
OriginalL'auteur Jim Garrison
Ok, j'ai tout compris.
Le XSLT je veux ressemble à ceci:
Le changement qu'il fixe était d'ajouter le exclude-result-prefixes l'attribut <xsl:stylesheet> de l'élément et de modifier l'article qui a été:
être la suivante à la place:
Et maintenant je suis de nouveau heureux.
Il y a probablement de meilleures façons de le faire, mais c'est de travailler pour moi. À l'avenir toute les suggestions sont toujours les bienvenus.
OriginalL'auteur AlarmTripper
Jim Garrison (mis à jour) la réponse est tout ce que vous devriez avoir besoin. Mais la mise à jour de la feuille de style que vous avez posté sorties d'un "espace de noms" attribut dans le résultat, donc je ne suis pas sûr de ce bien, qui ne vous.
L'essentiel à comprendre, c'est comment l'espace de noms par défaut fonctionne. Ne pensez pas xmlns comme un attribut que vous pouvez obtenir en sortie le résultat. Au lieu de cela, pensez-y comme un lexicale détail de votre feuille de style, dont le but est de définir l'espace de noms par défaut pour les tout-dessous (l'élément lui-même et chacun de ses descendants jusqu'remplacée). (À son tour, il a la même fonction dans le résultat XML, qui a une structure très différente de celle de la feuille de style elle-même.)
Littérale éléments dans votre feuille de style (par exemple, <message>) ainsi que <xsl:element> instructions (par exemple, <xsl:element name="message">) sur l'espace de noms par défaut lorsque le nom fourni ne pas utiliser un préfixe. Si vous voulez tous d'entre eux à prendre sur ce même espace de noms, alors vous aurez besoin de placer un espace de noms par défaut en haut de votre feuille de style, comme Jim Garrison suggéré.
Sinon, vous vous retrouverez avec certains éléments qui ne sont pas dans cet espace, c'est pourquoi le résultat contenu xmlns="" (la suppression de l'espace de noms pour les éléments).
OriginalL'auteur Evan Lenz