XSL:删除名称空间前缀

时间:2014-10-24 09:25:55

标签: xml xslt namespaces prefix

经过一段时间的搜索,我想我会问这里。我试图从XSL输出文件中删除空名称空间。让我提供相关代码:

输入XML

<?xml version="1.0" encoding="UTF-8"?>
<DK_RequestChangeOfSupplier xmlns="un:unece:260:data:EEM-DK_RequestChangeOfSupplier:v2">
    <HeaderEnergyDocument>
        <Creation>Date</Creation>
    </HeaderEnergyDocument>
</DK_RequestChangeOfSupplier>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:ns1="un:unece:260:data:EEM-DK_RequestChangeOfSupplier:v2"
            exclude-result-prefixes="ns1">

    <xsl:output method="xml" version="1.0" encoding="UTF-8"
            indent="yes" omit-xml-declaration="no"/>

    <xsl:template match="/">
        <xsl:for-each select="ns1:DK_RequestChangeOfSupplier">
            <McsDkSMBMsg 
             xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/McsDkSMBMsg">
                <xsl:call-template name="CreateElement">
                    <xsl:with-param name="ElementName" select="'Creation'" />
                </xsl:call-template>
            </McsDkSMBMsg>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="CreateElement">
        <xsl:param name="ElementName"></xsl:param>
        <xsl:element name="{$ElementName}">Testing</xsl:element>
    </xsl:template>
</xsl:stylesheet>

输出

<McsDkSMBMsg xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/McsDkSMBMsg">
    <Creation xmlns="">Testing</Creation>
</McsDkSMBMsg>

如何删除命名空间?我做XSL明智的做法是什么?我慢慢地把头发拉了出来。问候。

1 个答案:

答案 0 :(得分:0)

您的原始代码在输出树中添加了两个元素:一个名为McsDkSMBMsg,其中包含默认命名空间

<McsDkSMBMsg xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/McsDkSMBMsg">

另一个是Creation - 根据您的原始代码,它完全位于 no namespace 中。 XSLT处理器确保Creation元素不会在默认命名空间中结束的唯一方法是 undeclare 此命名空间:

<Creation xmlns="">Testing</Creation>

我假设您希望Creation元素也属于该默认命名空间。如果是这样,只需将相同的xmlns属性添加到创建xsl:element的{​​{1}}指令中。 XLST处理器将处理任何冗余的名称空间声明。

<强>样式表

Creation

XML输出

现在,<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="un:unece:260:data:EEM-DK_RequestChangeOfSupplier:v2" exclude-result-prefixes="ns1"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/> <xsl:template match="/"> <xsl:for-each select="ns1:DK_RequestChangeOfSupplier"> <McsDkSMBMsg xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/McsDkSMBMsg"> <xsl:call-template name="CreateElement"> <xsl:with-param name="ElementName" select="'Creation'" /> </xsl:call-template> </McsDkSMBMsg> </xsl:for-each> </xsl:template> <xsl:template name="CreateElement"> <xsl:param name="ElementName"></xsl:param> <xsl:element name="{$ElementName}" xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/McsDkSMBMsg">Testing</xsl:element> </xsl:template> </xsl:stylesheet> 元素仅存在xmlns元素。

McsDkSMBMsg

那就是说,也许你的代码需要一些改进。您正在将<?xml version="1.0" encoding="UTF-8"?> <McsDkSMBMsg xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/McsDkSMBMsg"> <Creation>Testing</Creation> </McsDkSMBMsg> 应用于最外层元素 - 其中只能有一个 - 这没有任何意义。此外,为新命名空间定义前缀可能更合理。并且你没有明显的原因调用命名模板。

它的用处取决于实际的XML输入和您已有的其他代码。

改进的样式表

for-each