Reputation: 1
I want to change the root tag of an ISO-20022 XML message including its namespace, definition and schemalocation by using XSLT.
I suceeded in all of the points, but I don't get why the xmlns="urn:iso:std:iso:20022:tech:xsd:sct:pacs.008.001.02" definition has been moved to all childs (from SCLSCT:FIToFICstmrCdtTrf to GrpHdr and added to the CdtTrfTxInf).
INPUT
<?xml version="1.0" encoding="UTF-8"?>
<SCLSCT:BBkICFBlkCdtTrf xmlns:SCLSCT="urn:BBkICF:xsd:$BBkICFBlkCdtTrf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:BBkICF:xsd:$BBkICFBlkCdtTrf BBkICFBlkCdtTrf.xsd">
<SCLSCT:SndgInst>XXXXXXXX</SCLSCT:SndgInst>
<SCLSCT:RcvgInst>XXXXXXXXXXX</SCLSCT:RcvgInst>
<SCLSCT:FileRef>XXX2019021100048</SCLSCT:FileRef>
<SCLSCT:SrvcID>SCT</SCLSCT:SrvcID>
<SCLSCT:TstCode>T</SCLSCT:TstCode>
<SCLSCT:FType>ICF</SCLSCT:FType>
<SCLSCT:FDtTm>2019-02-11T15:51:10.868+01:00</SCLSCT:FDtTm>
<SCLSCT:NumCTBlk>1</SCLSCT:NumCTBlk>
<SCLSCT:NumPCRBlk>1</SCLSCT:NumPCRBlk>
<SCLSCT:NumRFRBlk>1</SCLSCT:NumRFRBlk>
<SCLSCT:NumROIBlk>1</SCLSCT:NumROIBlk>
<SCLSCT:NumSRBlk>1</SCLSCT:NumSRBlk>
<SCLSCT:FIToFICstmrCdtTrf xmlns="urn:iso:std:iso:20022:tech:xsd:sct:pacs.008.001.02">
<GrpHdr>
<MsgId>XXXXXXXXS110219XXXXXXXXXXX000480005</MsgId>
<CreDtTm>2019-02-11T15:51:10.176+01:00</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<TtlIntrBkSttlmAmt Ccy="EUR">1</TtlIntrBkSttlmAmt>
<IntrBkSttlmDt>2019-02-11</IntrBkSttlmDt>
<SttlmInf>
<SttlmMtd>CLRG</SttlmMtd>
<ClrSys>
<Prtry>SCL</Prtry>
</ClrSys>
</SttlmInf>
<InstgAgt>
<FinInstnId>
<BIC>XXXXXXXX</BIC>
</FinInstnId>
</InstgAgt>
</GrpHdr>
<CdtTrfTxInf>
<PmtId>
<EndToEndId>XXXXXXXXXXXXXXXXXXXXX</EndToEndId>
<TxId>XXXXXXXXXXXXXXXXXXXXX</TxId>
</PmtId>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<IntrBkSttlmAmt Ccy="EUR">1</IntrBkSttlmAmt>
<ChrgBr>SLEV</ChrgBr>
<Dbtr>
<Nm>XXXXXXXXXXXXXXXXXXXXX</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXX</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>Creditor Name XXXXXXXXXXXXXXXXXXXXX</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Ustrd>Remittance Information XXXXXXXXXXXXXXXXXXXXX</Ustrd>
</RmtInf>
</CdtTrfTxInf>
</SCLSCT:FIToFICstmrCdtTrf>
</SCLSCT:BBkICFBlkCdtTrf>
DESIRED OUTPUT
?xml version="1.0" encoding="UTF-8"?>
<SCLSCT:BBkSCFBlkCdtTrf xmlns:SCLSCT="urn:BBkSCF:xsd:$BBkSCFBlkCdtTrf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:BBkSCF:xsd:$BBkSCFBlkCdtTrf BBkSCFBlkCdtTrf.xsd">
<SCLSCT:SndgInst>XXXXXXXX</SCLSCT:SndgInst>
<SCLSCT:RcvgInst>XXXXXXXXXXX</SCLSCT:RcvgInst>
<SCLSCT:FileRef>XXX2019021100048</SCLSCT:FileRef>
<SCLSCT:SrvcID>SCT</SCLSCT:SrvcID>
<SCLSCT:TstCode>T</SCLSCT:TstCode>
<SCLSCT:FType>ICF</SCLSCT:FType>
<SCLSCT:FDtTm>2019-02-11T15:51:10.868+01:00</SCLSCT:FDtTm>
<SCLSCT:NumCTBlk>1</SCLSCT:NumCTBlk>
<SCLSCT:NumPCRBlk>1</SCLSCT:NumPCRBlk>
<SCLSCT:NumRFRBlk>1</SCLSCT:NumRFRBlk>
<SCLSCT:NumROIBlk>1</SCLSCT:NumROIBlk>
<SCLSCT:NumSRBlk>1</SCLSCT:NumSRBlk>
<SCLSCT:FIToFICstmrCdtTrf xmlns="urn:iso:std:iso:20022:tech:xsd:sct:pacs.008.001.02">
<GrpHdr>
<MsgId>XXXXXXXXS110219XXXXXXXXXXX000480005</MsgId>
<CreDtTm>2019-02-11T15:51:10.176+01:00</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<TtlIntrBkSttlmAmt Ccy="EUR">1</TtlIntrBkSttlmAmt>
<IntrBkSttlmDt>2019-02-11</IntrBkSttlmDt>
<SttlmInf>
<SttlmMtd>CLRG</SttlmMtd>
<ClrSys>
<Prtry>SCL</Prtry>
</ClrSys>
</SttlmInf>
<InstgAgt>
<FinInstnId>
<BIC>XXXXXXXX</BIC>
</FinInstnId>
</InstgAgt>
</GrpHdr>
<CdtTrfTxInf>
<PmtId>
<EndToEndId>XXXXXXXXXXXXXXXXXXXXX</EndToEndId>
<TxId>XXXXXXXXXXXXXXXXXXXXX</TxId>
</PmtId>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<IntrBkSttlmAmt Ccy="EUR">1</IntrBkSttlmAmt>
<ChrgBr>SLEV</ChrgBr>
<Dbtr>
<Nm>XXXXXXXXXXXXXXXXXXXXX</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXX</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>Creditor Name XXXXXXXXXXXXXXXXXXXXX</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Ustrd>Remittance Information XXXXXXXXXXXXXXXXXXXXX</Ustrd>
</RmtInf>
</CdtTrfTxInf>
</SCLSCT:FIToFICstmrCdtTrf>
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:SCLSCT="urn:BBkICF:xsd:$BBkICFBlkCdtTrf" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="SCLSCT:*" xmlns:SCLSCT="urn:BBkICF:xsd:$BBkICFBlkCdtTrf">
<xsl:element name="{name()}" namespace="urn:BBkSCF:xsd:$BBkSCFBlkCdtTrf">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="SCLSCT:BBkICFBlkCdtTrf">
<SCLSCT:BBkSCFBlkCdtTrf xmlns:SCLSCT="urn:BBkSCF:xsd:$BBkSCFBlkCdtTrf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:apply-templates select="@* | node()"/>
</SCLSCT:BBkSCFBlkCdtTrf>
</xsl:template>
<xsl:template match="@xsi:schemaLocation">
<xsl:attribute name="xsi:schemaLocation">urn:BBkSCF:xsd:$BBkSCFBlkCdtTrf BBkSCFBlkCdtTrf.xsd</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
RESULT
<?xml version="1.0" encoding="UTF-8"?>
<SCLSCT:BBkSCFBlkCdtTrf xmlns:SCLSCT="urn:BBkSCF:xsd:$BBkSCFBlkCdtTrf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:BBkSCF:xsd:$BBkSCFBlkCdtTrf BBkSCFBlkCdtTrf.xsd">
<SCLSCT:SndgInst>XXXXXXXX</SCLSCT:SndgInst>
<SCLSCT:RcvgInst>XXXXXXXXXXX</SCLSCT:RcvgInst>
<SCLSCT:FileRef>XXX2019021100048</SCLSCT:FileRef>
<SCLSCT:SrvcID>SCT</SCLSCT:SrvcID>
<SCLSCT:TstCode>T</SCLSCT:TstCode>
<SCLSCT:FType>ICF</SCLSCT:FType>
<SCLSCT:FDtTm>2019-02-11T15:51:10.868+01:00</SCLSCT:FDtTm>
<SCLSCT:NumCTBlk>1</SCLSCT:NumCTBlk>
<SCLSCT:NumPCRBlk>1</SCLSCT:NumPCRBlk>
<SCLSCT:NumRFRBlk>1</SCLSCT:NumRFRBlk>
<SCLSCT:NumROIBlk>1</SCLSCT:NumROIBlk>
<SCLSCT:NumSRBlk>1</SCLSCT:NumSRBlk>
<SCLSCT:FIToFICstmrCdtTrf >
<GrpHdr xmlns="urn:iso:std:iso:20022:tech:xsd:sct:pacs.008.001.02">
<MsgId>XXXXXXXXS110219XXXXXXXXXXX000480005</MsgId>
<CreDtTm>2019-02-11T15:51:10.176+01:00</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<TtlIntrBkSttlmAmt Ccy="EUR">1</TtlIntrBkSttlmAmt>
<IntrBkSttlmDt>2019-02-11</IntrBkSttlmDt>
<SttlmInf>
<SttlmMtd>CLRG</SttlmMtd>
<ClrSys>
<Prtry>SCL</Prtry>
</ClrSys>
</SttlmInf>
<InstgAgt>
<FinInstnId>
<BIC>XXXXXXXX</BIC>
</FinInstnId>
</InstgAgt>
</GrpHdr>
<CdtTrfTxInf xmlns="urn:iso:std:iso:20022:tech:xsd:sct:pacs.008.001.02">
<PmtId>
<EndToEndId>XXXXXXXXXXXXXXXXXXXXX</EndToEndId>
<TxId>XXXXXXXXXXXXXXXXXXXXX</TxId>
</PmtId>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<IntrBkSttlmAmt Ccy="EUR">1</IntrBkSttlmAmt>
<ChrgBr>SLEV</ChrgBr>
<Dbtr>
<Nm>XXXXXXXXXXXXXXXXXXXXX</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXX</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>Creditor Name XXXXXXXXXXXXXXXXXXXXX</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Ustrd>Remittance Information XXXXXXXXXXXXXXXXXXXXX</Ustrd>
</RmtInf>
</CdtTrfTxInf>
</SCLSCT:FIToFICstmrCdtTrf>
</SCLSCT:BBkICFBlkCdtTrf>
Any help is highly appreciated! THX
Upvotes: 0
Views: 613
Reputation: 163645
XSLT works on a tree data model in which the namespaces are represented rather differently from how they appear in the lexical XML.
(a) every element and attribute node has an expanded name, consisting of a namespace URI plus local name. When you copy an element, its expanded name stays the same; the new copy gets its namespace URI from the element that you are copying, not from its parent element in the result tree. So if you change the expanded name of the parent element and don't change the expanded names of its children, then the children can end up in a different namespace from the parent.
(b) namespace declarations don't appear as attribute nodes on the tree. There is a namespace fixup process which ensures that in the final serialization of the result tree, all the namespaces used in element and attribute names are automatically declared. If you rename a root element, but don't rename its children, then the namespace that the children are in will end up being declared on the child elements.
Upvotes: 3