如何用XSLT仅替换指定前缀ns2为Saa并保留其他元素
替换XML指定命名空间前缀的XSLT实现
需求说明:将XML中所有前缀为ns2的元素替换为Saa前缀,其他前缀(如head、pacs)或无前缀的元素保持原样,仅修改目标命名空间的前缀别名,不改变命名空间URI及其他内容。
XSLT代码实现
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="urn:swift:saa:xsd:saa.2.0" xmlns:Saa="urn:swift:saa:xsd:saa.2.0" exclude-result-prefixes="ns2"> <!-- 身份模板:默认复制所有节点、属性、文本、注释等 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配ns2命名空间下的元素,替换前缀为Saa --> <xsl:template match="ns2:*"> <Saa:{local-name()}> <xsl:apply-templates select="@*|node()"/> </Saa:{local-name()}> </xsl:template> <!-- 若有ns2前缀的属性,同样替换前缀(示例XML中无此类属性,可按需保留) --> <xsl:template match="@ns2:*"> <xsl:attribute name="Saa:{local-name()}" namespace="urn:swift:saa:xsd:saa.2.0"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> </xsl:stylesheet>
代码要点说明
- 同时声明原
ns2和新Saa对应同一个命名空间URI,确保语义完全不变。 exclude-result-prefixes="ns2"避免输出结果中保留原ns2的命名空间声明。- 身份模板保证所有非目标节点原样复制,仅对
ns2命名空间下的元素(及属性)进行前缀替换。 - 使用
local-name()提取元素/属性的本地名称,结合新前缀生成符合要求的节点。
转换后XML示例
<?xml version="1.0"?> <Saa:DataPDU xmlns:Saa="urn:swift:saa:xsd:saa.2.0"> <Saa:Revision>2.0.13</Saa:Revision> <Saa:Header> <Saa:Message> <Saa:SenderReference>X</Saa:SenderReference> <Saa:MessageIdentifier>Y</Saa:MessageIdentifier> <Saa:Format>Z</Saa:Format> <Saa:Sender> <Saa:DN>DN1</Saa:DN> </Saa:Sender> <Saa:Receiver> <Saa:DN>DN2</Saa:DN> </Saa:Receiver> <Saa:NetworkInfo> <Saa:Service>Service</Saa:Service> </Saa:NetworkInfo> </Saa:Message> </Saa:Header> <Saa:Body> <head:AppHdr xmlns:head="urn:iso:std:iso:20022:tech:xsd:head.001.001.02"> <head:Fr> <head:FIId> <head:FinInstnId> <head:BICFI>ABC</head:BICFI> </head:FinInstnId> </head:FIId> </head:Fr> <head:To> <head:FIId> <head:FinInstnId> <head:BICFI>XYZ</head:BICFI> </head:FinInstnId> </head:FIId> </head:To> <head:BizMsgIdr>123</head:BizMsgIdr> <head:MsgDefIdr>P8</head:MsgDefIdr> <head:BizSvc>02</head:BizSvc> <head:CreDt>2024-07-22</head:CreDt> </head:AppHdr> <pacs:Document xmlns:pacs="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08"> <pacs:FIToFICstmrCdtTrf> <pacs:GrpHdr> <pacs:MsgId>MsgId</pacs:MsgId> <pacs:CreDtTm>2024-07-22</pacs:CreDtTm> <pacs:NbOfTxs>1</pacs:NbOfTxs> <pacs:SttlmInf> <pacs:SttlmMtd>XYZ</pacs:SttlmMtd> </pacs:SttlmInf> </pacs:GrpHdr> <pacs:FIToFICstmrCdtTrf> </pacs:Document> </Saa:Body> </Saa:DataPDU>
内容的提问来源于stack exchange,提问作者user2101374
相关产品推荐
相关产品推荐

