Reputation: 35
My goal is to achieve a output xml where initial first 2 nodes have namespace as below.
<tp:Revision>2.0.10</tp:Revision> <tp:Header>
and from message and all of its child nodes have namespace prefix as header:elementname.
Below is my input xml :
<DataPDU xmlns="urn:swift:saa:xsd:saa.2.0">
<Revision>2.0.10</Revision>
<Header>
<Message>
<SenderReference>112712406</SenderReference>
<MessageIdentifier>pacs.008.001.08</MessageIdentifier>
<Format>MX</Format>
<SubFormat>Input</SubFormat>
<Sender>
<DN>ou=xxx,o=ctbaau2s,o=swift</DN>
<FullName>
<X1>CTBAAU2SFXD</X1>
</FullName>
</Sender>
<Receiver>
<DN>ou=xxx,o=testcsns,o=swift</DN>
<FullName>
<X1>TESTCSNSSFXXX</X1>
</FullName>
</Receiver>
<InterfaceInfo>
<UserReference>M13782445</UserReference>
</InterfaceInfo>
<NetworkInfo>
<SWIFTNetNetworkInfo>
<RequestType>pacs.008.001.08</RequestType>
<RequestSubtype>swift.cbprplus.02</RequestSubtype>
</SWIFTNetNetworkInfo>
</NetworkInfo>
</Message>
</Header>
<Body>
<AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<Fr>
<FIId>
<FinInstnId>
<BICFI>CTBAAU2SFXD</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>TESTCSNSSFXXX</BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>M13782445</BizMsgIdr>
<MsgDefIdr>pacs.008.001.08</MsgDefIdr>
<BizSvc>swift.cbprplus.02</BizSvc>
<CreDt>2024-07-03T20:43:32+10:00</CreDt>
</AppHdr>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<FIToFICstmrCdtTrf>
<GrpHdr>
<MsgId>M13782445</MsgId>
<CreDtTm>2024-07-03T20:43:32+10:00</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<SttlmInf>
<SttlmMtd>INDA</SttlmMtd>
</SttlmInf>
</GrpHdr>
<CdtTrfTxInf>
<PmtId>
<InstrId>M13782445</InstrId>
<EndToEndId>M13782445</EndToEndId>
<UETR>a3d0dc5e-1b14-4e21-b431-8cf64396a978</UETR>
</PmtId>
<IntrBkSttlmAmt Ccy="CHF">50004166.67</IntrBkSttlmAmt>
<IntrBkSttlmDt>2024-04-12</IntrBkSttlmDt>
<ChrgBr>abc</ChrgBr>
<InstgAgt>
<FinInstnId>
<BICFI>CTBAAU2SFXD</BICFI>
</FinInstnId>
</InstgAgt>
<InstdAgt>
<FinInstnId>
<BICFI>TESTCSNSSFXXX</BICFI>
</FinInstnId>
</InstdAgt>
<IntrmyAgt1>
<FinInstnId>
<BICFI>TESTSWINT33</BICFI>
</FinInstnId>
</IntrmyAgt1>
<IntrmyAgt2>
<FinInstnId>
<BICFI>TESTSWINT22</BICFI>
</FinInstnId>
</IntrmyAgt2>
<Dbtr>
<Id>
<OrgId>
<AnyBIC>CTBAAU2SFXD</AnyBIC>
</OrgId>
</Id>
</Dbtr>
<DbtrAgt>
<FinInstnId>
<BICFI>TESTCSNSSFXXX</BICFI>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BICFI>TESTSWINT11</BICFI>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Id>
<OrgId>
<AnyBIC>TESTSWTBEN1</AnyBIC>
</OrgId>
</Id>
</Cdtr>
<InstrForCdtrAgt>
<Cd>codcdtr1</Cd>
<InstrInf>intfcdtr1</InstrInf>
</InstrForCdtrAgt>
<InstrForNxtAgt>
<InstrInf>infnxt1</InstrInf>
</InstrForNxtAgt>
</CdtTrfTxInf>
</FIToFICstmrCdtTrf>
</Document>
</Body>
</DataPDU>
Below is my target output xml :
<DataPDU xmlns="http://www.tutorialspoint.com" xmlns:tp="http://www.tutorialspoint.com" xmlns:head="urn:iso:std:iso:20022:tech:xsd:head.001.001.04" xmlns:header="urn:iso:std:iso:20022:tech:xsd:header.001.001.04" xmlns:pacs="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.12">
<tp:Revision>2.0.10</tp:Revision>
<tp:Header>
<header:Message>
<header:SenderReference>112712406</header:SenderReference>
<header:MessageIdentifier>pacs.008.001.08</header:MessageIdentifier>
<header:Format>MX</header:Format>
<header:SubFormat>Input</header:SubFormat>
<header:Sender>
<header:DN>ou=xxx,o=ctbaau2s,o=swift</header:DN>
<header:FullName>
<header:X1>CTBAAU2SFXD</header:X1>
</header:FullName>
</header:Sender>
<header:Receiver>
<header:DN>ou=xxx,o=testcsns,o=swift</header:DN>
<header:FullName>
<header:X1>TESTCSNSSFX</header:X1>
</header:FullName>
</header:Receiver>
<header:InterfaceInfo>
<header:UserReference>M13782445</header:UserReference>
</header:InterfaceInfo>
<header:NetworkInfo>
<header:SWIFTNetNetworkInfo>
<header:RequestType>pacs.008.001.08</header:RequestType>
<header:RequestSubtype>swift.cbprplus.02</header:RequestSubtype>
</header:SWIFTNetNetworkInfo>
</header:NetworkInfo>
</header:Message>
</tp:Header>
</DataPDU>
Below is my XSLT :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:main="urn:swift:saa:xsd:saa.2.0" xmlns="http://www.tutorialspoint.com" xmlns:tp="http://www.tutorialspoint.com" xmlns:head="urn:iso:std:iso:20022:tech:xsd:head.001.001.04" xmlns:header="urn:iso:std:iso:20022:tech:xsd:header.001.001.04" version="1.0">
<xsl:template match="/">
<DataPDU>
<tp:Revision>
<xsl:value-of select="/main:DataPDU/main:Header/main:Message/main:MessageIdentifier" />
</tp:Revision>
<tp:Header>
<!--
<xsl:apply-templates select="/main:DataPDU/main:Header/main:Message" />
-->
<xsl:apply-templates />
</tp:Header>
</DataPDU>
</xsl:template>
<xsl:template match="*[ancestor-or-self::main:Message]">
<xsl:element name="header:{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
This is still produces wrong output as below. Did a lot of research still struggling to figure out how to do this.
Wrong output :
<?xml version="1.0" encoding="UTF-8"?>
<DataPDU xmlns="http://www.tutorialspoint.com" xmlns:header="urn:iso:std:iso:20022:tech:xsd:header.001.001.04" xmlns:head="urn:iso:std:iso:20022:tech:xsd:head.001.001.04" xmlns:tp="http://www.tutorialspoint.com" xmlns:main="urn:swift:saa:xsd:saa.2.0">
<tp:Revision>pacs.008.001.08</tp:Revision>
<tp:Header>
<DataPDU xmlns="urn:swift:saa:xsd:saa.2.0">
<Revision>2.0.10</Revision>
<Header>
<header:Message>
<header:SenderReference>112712406</header:SenderReference>
<header:MessageIdentifier>pacs.008.001.08</header:MessageIdentifier>
<header:Format>MX</header:Format>
<header:SubFormat>Input</header:SubFormat>
<header:Sender>
<header:DN>ou=xxx,o=ctbaau2s,o=swift</header:DN>
<header:FullName>
<header:X1>CTBAAU2SFXD</header:X1>
</header:FullName>
</header:Sender>
<header:Receiver>
<header:DN>ou=xxx,o=testcsns,o=swift</header:DN>
<header:FullName>
<header:X1>TESTCSNSSFXXX</header:X1>
</header:FullName>
</header:Receiver>
<header:InterfaceInfo>
<header:UserReference>M13782445</header:UserReference>
</header:InterfaceInfo>
<header:NetworkInfo>
<header:SWIFTNetNetworkInfo>
<header:RequestType>pacs.008.001.08</header:RequestType>
<header:RequestSubtype>swift.cbprplus.02</header:RequestSubtype>
</header:SWIFTNetNetworkInfo>
</header:NetworkInfo>
</header:Message>
</Header>
<Body>
<AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<Fr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<FIId xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<FinInstnId xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<BICFI xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">CTBAAU2SFXD</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<FIId xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<FinInstnId xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<BICFI xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">TESTCSNSSFXXX</BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">M13782445</BizMsgIdr>
<MsgDefIdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">pacs.008.001.08</MsgDefIdr>
<BizSvc xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">swift.cbprplus.02</BizSvc>
<CreDt xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">2024-07-03T20:43:32+10:00</CreDt>
</AppHdr>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<FIToFICstmrCdtTrf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<GrpHdr xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<MsgId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">M13782445</MsgId>
<CreDtTm xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">2024-07-03T20:43:32+10:00</CreDtTm>
<NbOfTxs xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">1</NbOfTxs>
<SttlmInf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<SttlmMtd xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">INDA</SttlmMtd>
</SttlmInf>
</GrpHdr>
<CdtTrfTxInf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<PmtId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<InstrId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">M13782445</InstrId>
<EndToEndId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">M13782445</EndToEndId>
<UETR xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">a3d0dc5e-1b14-4e21-b431-8cf64396a978</UETR>
</PmtId>
<IntrBkSttlmAmt xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08" Ccy="CHF">50004166.67</IntrBkSttlmAmt>
<IntrBkSttlmDt xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">2024-04-12</IntrBkSttlmDt>
<ChrgBr xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">abc</ChrgBr>
<InstgAgt xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<FinInstnId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<BICFI xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">CTBAAU2SFXD</BICFI>
</FinInstnId>
</InstgAgt>
<InstdAgt xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<FinInstnId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<BICFI xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">TESTCSNSSFXXX</BICFI>
</FinInstnId>
</InstdAgt>
<IntrmyAgt1 xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<FinInstnId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<BICFI xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">TESTSWINT33</BICFI>
</FinInstnId>
</IntrmyAgt1>
<IntrmyAgt2 xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<FinInstnId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<BICFI xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">TESTSWINT22</BICFI>
</FinInstnId>
</IntrmyAgt2>
<Dbtr xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<Id xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<OrgId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<AnyBIC xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">CTBAAU2SFXD</AnyBIC>
</OrgId>
</Id>
</Dbtr>
<DbtrAgt xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<FinInstnId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<BICFI xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">TESTCSNSSFXXX</BICFI>
</FinInstnId>
</DbtrAgt>
<CdtrAgt xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<FinInstnId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<BICFI xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">TESTSWINT11</BICFI>
</FinInstnId>
</CdtrAgt>
<Cdtr xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<Id xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<OrgId xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<AnyBIC xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">TESTSWTBEN1</AnyBIC>
</OrgId>
</Id>
</Cdtr>
<InstrForCdtrAgt xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<Cd xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">codcdtr1</Cd>
<InstrInf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">intfcdtr1</InstrInf>
</InstrForCdtrAgt>
<InstrForNxtAgt xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<InstrInf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">infnxt1</InstrInf>
</InstrForNxtAgt>
</CdtTrfTxInf>
</FIToFICstmrCdtTrf>
</Document>
</Body>
</DataPDU>
</tp:Header>
</DataPDU>
Upvotes: 0
Views: 124
Reputation: 3213
Here's another suggestion that produces an output which is semantically but not lexically the same as your desired output.
The elements in the new document are renamed to use the namespace URI http://www.tutorialspoint.com
, except those that were descendants of the Message
element, which are renamed to use the urn:iso:std:iso:20022:tech:xsd:header.001.001.04
namespace URI. In both cases the namespace URI is used as the default namespace (i.e. it used unprefixed in the names of the elements). Incidentally this produces the smallest serialization of the desired element names.
A separate template matching the Body
element is used to discard that element.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:main="urn:swift:saa:xsd:saa.2.0"
exclude-result-prefixes="main">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*[ancestor-or-self::main:Message]">
<xsl:element name="{local-name()}" namespace="urn:iso:std:iso:20022:tech:xsd:header.001.001.04">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="http://www.tutorialspoint.com">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="main:Body"/>
</xsl:stylesheet>
Result:
<?xml version="1.0" encoding="UTF-8"?>
<DataPDU xmlns="http://www.tutorialspoint.com">
<Revision>2.0.10</Revision>
<Header>
<Message xmlns="urn:iso:std:iso:20022:tech:xsd:header.001.001.04">
<SenderReference>112712406</SenderReference>
<MessageIdentifier>pacs.008.001.08</MessageIdentifier>
<Format>MX</Format>
<SubFormat>Input</SubFormat>
<Sender>
<DN>ou=xxx,o=ctbaau2s,o=swift</DN>
<FullName>
<X1>CTBAAU2SFXD</X1>
</FullName>
</Sender>
<Receiver>
<DN>ou=xxx,o=testcsns,o=swift</DN>
<FullName>
<X1>TESTCSNSSFXXX</X1>
</FullName>
</Receiver>
<InterfaceInfo>
<UserReference>M13782445</UserReference>
</InterfaceInfo>
<NetworkInfo>
<SWIFTNetNetworkInfo>
<RequestType>pacs.008.001.08</RequestType>
<RequestSubtype>swift.cbprplus.02</RequestSubtype>
</SWIFTNetNetworkInfo>
</NetworkInfo>
</Message>
</Header>
</DataPDU>
Upvotes: 1
Reputation: 3161
I think the output you want could be produced simply by:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:main="urn:swift:saa:xsd:saa.2.0"
xmlns:tp="http://www.tutorialspoint.com"
xmlns:header="urn:iso:std:iso:20022:tech:xsd:header.001.001.04"
xmlns="http://www.tutorialspoint.com"
exclude-result-prefixes="main">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/main:DataPDU">
<DataPDU>
<xsl:apply-templates select="main:Revision | main:Header"/>
</DataPDU>
</xsl:template>
<xsl:template match="main:Revision | main:Header">
<xsl:element name="tp:{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="main:*">
<xsl:element name="header:{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
I have left out these namespace declarations because I don't see them being used anywhere:
xmlns:head="urn:iso:std:iso:20022:tech:xsd:head.001.001.04"
xmlns:pacs="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.12"
But if you want, you can add them to the namespaces declared in the xsl:stylesheet
start tag and they will be copied to the output.
Upvotes: 1