SAP PI中XSLT 1.0节点命名空间修改/添加需求求助
SAP PI中XSLT 1.0 命名空间修改/添加方案
核心思路
通过XSLT模板匹配机制,针对不同节点分别处理命名空间的修改或添加,同时完整保留节点内容与原有结构。
示例输入(Input.xml)
<Root> <OldNamespaceNode xmlns="http://old.namespace.com"> <Child>Value1</Child> </OldNamespaceNode> <NoNamespaceNode> <SubChild>Value2</SubChild> </NoNamespaceNode> </Root>
期望输出(Output.xml)
<Root xmlns="http://default.new.namespace.com"> <NewNamespaceNode xmlns="http://new.namespace.com"> <Child>Value1</Child> </NewNamespaceNode> <NoNamespaceNode xmlns="http://new.namespace.com"> <SubChild>Value2</SubChild> </NoNamespaceNode> </Root>
可行的XSLT 1.0样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:old="http://old.namespace.com" exclude-result-prefixes="old"> <!-- 匹配根节点,添加默认命名空间 --> <xsl:template match="/Root"> <Root xmlns="http://default.new.namespace.com"> <xsl:apply-templates/> </Root> </xsl:template> <!-- 匹配旧命名空间下的节点,替换命名空间与节点名 --> <xsl:template match="old:OldNamespaceNode"> <NewNamespaceNode xmlns="http://new.namespace.com"> <xsl:apply-templates select="@*|node()"/> </NewNamespaceNode> </xsl:template> <!-- 匹配无命名空间的目标节点,添加指定命名空间 --> <xsl:template match="NoNamespaceNode"> <NoNamespaceNode xmlns="http://new.namespace.com"> <xsl:apply-templates select="@*|node()"/> </NoNamespaceNode> </xsl:template> <!-- 通用模板:复制所有属性、文本、子节点,保留原有结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 声明旧命名空间前缀
old,用于精准匹配目标节点,exclude-result-prefixes避免该前缀出现在最终输出中。 - 根节点模板:替换根节点的默认命名空间,同时触发内部节点的处理逻辑。
- 旧命名空间节点模板:匹配指定旧命名空间下的节点,替换为新节点名与新命名空间,同步复制所有属性与子节点。
- 无命名空间节点模板:给目标节点添加指定命名空间,保留节点名称与内部内容。
- 通用复制模板:确保未被特殊匹配的节点、属性、文本原样复制,防止结构丢失。
适配调整
如果你的实际节点结构、命名空间与示例不同,只需修改以下部分:
- 调整
xmlns:old="http://old.namespace.com"中的旧命名空间地址为你的实际旧命名空间。 - 修改模板匹配的节点名(如
old:OldNamespaceNode、NoNamespaceNode)为你的目标节点名称。 - 替换模板中的新命名空间地址(
http://new.namespace.com、http://default.new.namespace.com)为需求中的实际地址。
内容的提问来源于stack exchange,提问作者IntegrationExpert
相关产品推荐
相关产品推荐

