经过一段时间的搜索,我想我会问这里。我试图从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明智的做法是什么?我慢慢地把头发拉了出来。问候。
答案 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