Ok, j'ai vu de nombreuses variations sur cette question, mais aucune ne répond exactement à ce que j'essaie de résoudre et peut-être Je suis trop dense pour voir comment appliquer l'une des autres réponses à ce que j'essaie de faire.Comment éliminer les xmlns = "" entrées produites par transformation XSLT d'un document XML en un autre document XML
J'ai quelques XML qui ressemble à quelque chose comme ce qui suit:
<?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 je demande à ce XML. Le XSLT est similaire à ce qui suit:
<?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 essentiellement ce que je veux et ressemble à ce qui 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 ce que je ne veux pas sont les xmlns = » " attributs dans le <messageHeader> et <messageBody> éléments.
Maintenant, j'ai trouvé que si je spécifie explicitement l'espace de noms dans le XSLT pour ces éléments, alors l'attribut non désiré est poussé vers le bas d'un niveau pour les enfants de ces attributs.
je pouvais passer par mon XSLT entier et ajouter explicitement les xmlns = « » http://www.companyname.com/schemas/product/Version001 " attribut à chacun de mes xsl:. Élément définitions, mais je sais qu'il doit y avoir une Nous façon plus élégante programmeurs Je suis trop paresseux pour n'avoir pas de raccourci pour ce genre de non-sens.Si mon XSLT ne consistait pas en quelque chose d'aussi simple que l'exemple raccourci, je serais tenté de le faire de cette façon.Mais je sais qu'il doit y avoir un meilleur moyen.
Est-ce que quelqu'un sait ce que je suis absent ici?
Merci,
AlarmTripper
N'a pas modifié le fichier XML de sortie. – AlarmTripper
Quel processeur XSLT utilisez-vous? –
Oui, j'ai confirmé que votre nouvelle suggestion fonctionne également et est probablement une meilleure solution que la mienne car elle maintient l'assignation xmlns dans l'élément de la feuille de style. Et l'option #default m'empêche d'avoir à exclure chacun des autres préfixes d'espace de noms. Merci beaucoup. J'ai beaucoup à apprendre sur ce truc XSLT et je pense que les espaces de noms sont probablement l'un des aspects les plus complexes. – AlarmTripper