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