如何消除由一个XML文档的XSLT转换生成的xmlns =""条目到另一个XML文档

Ala*_*per 13 xslt namespaces xml-namespaces

好吧,我已经看到了很多关于这个问题的变化,但没有一个完全回答我想要解决的问题,也许我只是太过密集而无法看到如何将其他答案应用于我正在尝试做的事情.

我有一些类似于以下内容的XML:

<?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>
Run Code Online (Sandbox Code Playgroud)

现在我有一个XSLT转换,我正在应用于这个XML.XSLT类似于以下内容:

<?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>
Run Code Online (Sandbox Code Playgroud)

我得到的输出基本上是我想要的,如下所示:

<?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>
Run Code Online (Sandbox Code Playgroud)

但我不希望是的xmlns =""的属性<的MessageHeader><消息体>元素.

现在我发现如果我在XSLT中为这些元素显式指定了名称空间,那么不需要的属性会被推下一级到这些属性的子级.

我可以通过我的整个XSLT并明确地将xmlns ="" http://www.companyname.com/schemas/product/Version001 "属性添加到我的每个xsl:元素定义中,但我知道必须有一个更优雅的方式.我们的程序员懒得没有这种废话的捷径.如果我的XSLT不是像缩短的例子那样简单的东西,我很想这样做.但我知道那里必须是一个更好的方法.

有谁知道我在这里缺少什么?

谢谢,

AlarmTripper

Jim*_*son 9

在xsl:stylesheet标记上使用带有前缀"#default"的exclude-result-prefixes

w3c中对此的引用是HERE

编辑:好的,我应该更仔细地研究你的XSL.将消息标记上的xmlns移动到样式表标记.这会将所有结果元素放在同一名称空间中,并在消息标记上生成一个名称空间属性.我在Oxygen/XML中运行它并得到你想要的输出.