【问题标题】:Change root tag, namespace and schemalocation of XML with XSLT使用 XSLT 更改 XML 的根标记、名称空间和模式位置
【发布时间】:2019-07-14 01:17:11
【问题描述】:

我想使用 XSLT 更改 ISO-20022 XML 消息的根标记,包括其名称空间、定义和架构位置。

  • 根标签: SCLSCT:BBkICFBlkCdtTrf --> SCLSCT:BBkSCFBlkCdtTrf
  • xmlns: xmlns:SCLSCT="urn:BBkICF:xsd:$BBkICFBlkCdtTrf" --> xmlns:SCLSCT="urn:BBkSCF:xsd:$BBkSCFBlkCdtTrf"
  • schemalocation: xsi:schemaLocation="urn:BBkICF:xsd:$BBkICFBlkCdtTrf BBkICFBlkCdtTrf.xsd" --> xsi:schemaLocation="urn:BBkSCF:xsd:$BBkSCFBlkCdtTrf BBkSCFBlkCdtTrf .xsd"

我在所有方面都成功了,但我不明白为什么 xmlns="urn:iso:std:iso:20022:tech:xsd:sct:pacs.008.001.02" 定义已移至所有孩子(从 SCLSCT:FIToFICstmrCdtTrf 到 GrpHdr 并添加到 CdtTrfTxInf)。

输入

<?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>

期望的输出

?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>

结果

<?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>

非常感谢任何帮助! 谢了

【问题讨论】:

  • 命名空间声明的位置没有区别。您正在修改为其子元素声明默认命名空间的父元素,因此处理器输出修改后的父元素,然后复制包含它们的命名空间的子元素。

标签: xml xslt


【解决方案1】:

XSLT 在树形数据模型上工作,其中名称空间的表示方式与它们在词法 XML 中的显示方式截然不同。

(a) 每个元素和属性节点都有一个扩展名称,由命名空间 URI 和本地名称组成。当你复制一个元素时,它的扩展名保持不变;新副本从您正在复制的元素获取其命名空间 URI,而不是从结果树中的父元素获取。因此,如果您更改父元素的扩展名称并且不更改其子元素的扩展名称,那么子元素可能最终位于与父元素不同的命名空间中。

(b) 命名空间声明不会作为属性节点出现在树上。有一个命名空间修复过程,可确保在结果树的最终序列化中,自动声明元素和属性名称中使用的所有命名空间。如果您重命名根元素,但不重命名其子元素,则子元素所在的命名空间最终将在子元素上声明。

【讨论】:

  • 非常感谢!我还可以通过重命名孩子来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多