如何使用XSLT转换XML命名空间?能否实现指定XML格式转换?
使用XSLT进行XML命名空间转换的方法及示例
一、命名空间转换的核心思路
要完成XML命名空间的转换,核心要抓住这几点:
- 在XSLT里正确绑定并匹配原命名空间下的元素(可以通过前缀绑定或者
xpath-default-namespace属性) - 输出时指定目标命名空间,按需添加或保留其他必要的命名空间声明
- 编写模板规则,完整复制原XML的元素、属性、文本等内容,只修改命名空间相关部分
二、针对你提供的XML的具体转换方案
下面是完全匹配你需求的XSLT实现,它会完成:
- 将原
ns1前缀对应的命名空间(http://www.rof.com/schemas/)转换为rof前缀 - 修改输出XML的编码为
ISO-8859-1 - 添加
xsi命名空间声明(http://www.w3.org/2001/XMLSchema-instance)
原输入XML
<?xml version="1.0" encoding="UTF-8"?> <ns1:Message xmlns:ns1="http://www.rof.com/schemas/"> <Head Release="1.2.0" TransDate="2018-08-07T23:39:00" SplitLevel=""/> <Data> <Business BusinessId="ROF"> </Business> </Data> </ns1:Message>
转换用的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:old-ns="http://www.rof.com/schemas/" xmlns:rof="http://www.rof.com/schemas/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="old-ns"> <!-- 配置输出参数:指定编码、保留XML声明、开启缩进 --> <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/> <!-- 匹配原根元素,转换为目标命名空间的根元素 --> <xsl:template match="old-ns:Message"> <rof:Message> <!-- 复制所有需要保留的命名空间声明 --> <xsl:copy-of select="namespace::* | ../namespace::xsi"/> <!-- 处理根元素的属性和子节点 --> <xsl:apply-templates select="@* | node()"/> </rof:Message> </xsl:template> <!-- 匹配所有非命名空间绑定的元素,直接复制结构 --> <xsl:template match="*"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 复制所有属性 --> <xsl:template match="@*"> <xsl:copy/> </xsl:template> <!-- 复制文本、注释、处理指令等节点 --> <xsl:template match="text() | comment() | processing-instruction()"> <xsl:copy/> </xsl:template> </xsl:stylesheet>
转换后的输出XML
<?xml version="1.0" encoding="ISO-8859-1"?> <rof:Message xmlns:rof="http://www.rof.com/schemas/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Head Release="1.2.0" TransDate="2018-08-07T23:39:00" SplitLevel=""/> <Data> <Business BusinessId="ROF"> </Business> </Data> </rof:Message>
三、关键细节解释
- 命名空间绑定:用
old-ns绑定原命名空间,方便精准匹配原根元素;同时提前绑定目标rof和xsi命名空间,确保输出时自动包含这些声明。 exclude-result-prefixes:用来排除输出中不需要的前缀(比如这里的old-ns),避免生成冗余的命名空间声明。- 节点复制逻辑:通过不同的模板匹配元素、属性、文本等节点类型,保证原XML的结构和内容完全保留,只修改根元素的命名空间前缀和输出编码。
内容的提问来源于stack exchange,提问作者partho
相关产品推荐
相关产品推荐

