XSLT转换问题:为现有元素添加节点时的命名空间异常处理
XSLT转换时解决命名空间变更及节点添加问题
你的XSLT出现多余命名空间的核心原因有两点:
- 匹配
faia:Contact的模板使用<xsl:copy>,直接保留了原节点的旧命名空间(urn:StandardAuditFile-Taxation-Financial:DK),未转换为目标命名空间。 - 新增的
<Telephone>节点未指定目标命名空间,导致继承上下文的空命名空间,引发命名空间冲突。
以下是修正后的XSLT代码:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:faia="urn:StandardAuditFile-Taxation-Financial:DK" exclude-result-prefixes="faia"> <!-- 统一管理目标命名空间 --> <xsl:variable name="target-ns" select="'urn:OECD:StandardAuditFile-Taxation/2.00'"/> <!-- 默认模板:将所有元素转换到目标命名空间 --> <xsl:template match="*"> <xsl:element name="{local-name()}" namespace="{$target-ns}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <!-- 处理属性:保留属性值,移除原命名空间 --> <xsl:template match="@*"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> <!-- 复制文本、注释、处理指令 --> <xsl:template match="text() | comment() | processing-instruction()"> <xsl:copy/> </xsl:template> <!-- 处理Contact节点:创建目标命名空间的节点并添加Telephone --> <xsl:template match="faia:Contact"> <xsl:element name="Contact" namespace="{$target-ns}"> <xsl:apply-templates select="@* | node()"/> <!-- 添加目标命名空间下的Telephone节点 --> <xsl:element name="Telephone" namespace="{$target-ns}">123456789</xsl:element> </xsl:element> </xsl:template> </xsl:stylesheet>
修正说明:
- 通过
exclude-result-prefixes="faia"排除原命名空间前缀,避免输出多余的命名空间声明。 - 替换
<xsl:copy>为<xsl:element>创建Contact节点,强制使用目标命名空间,确保父节点命名空间正确。 - 新增的
Telephone节点同样通过<xsl:element>指定目标命名空间,保证它属于新的默认命名空间,不会出现空命名空间或冲突。 - 用变量
target-ns统一管理目标命名空间,提升代码可维护性。
转换后将得到你期望的输出:所有元素均属于urn:OECD:StandardAuditFile-Taxation/2.00命名空间,Contact节点下正确添加了Telephone节点,无多余命名空间。
内容的提问来源于stack exchange,提问作者SabrinaL.
相关产品推荐
相关产品推荐

