XML转换 - 输出文件中的不完整声明

时间:2017-10-20 08:13:54

标签: xml xslt xsd

在我第一次发布不完整后,我会再次尝试使用更详细的信息。

这是我输入的文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:BBkDNFBlkDirDeb xmlns:ns5="urn:iso:std:iso:20022:tech:xsd:sdd:pacs.003.001.02" xmlns:ns1="urn:BBkDNF:xsd:BBkDNFBlkDirDeb">
    <ns1:SndgInst>MARKDEF0</ns1:SndgInst>
    <ns1:RcvgInst>HYVEDEMXXX</ns1:RcvgInst>
    <ns1:SrvcId>COR</ns1:SrvcId>
    <ns1:TstCode>T</ns1:TstCode>
    <ns1:FType>DNF</ns1:FType>
    <ns1:FileRef>20171020COR13143</ns1:FileRef>
    <ns1:FileBusDt>2017-10-20</ns1:FileBusDt>
    <ns1:RoutingInd>ALL</ns1:RoutingInd>
    <ns1:FileCycleNo>05</ns1:FileCycleNo>
    <ns1:NumDDBlk>00000001</ns1:NumDDBlk>
    <ns1:NumPCRBlk>00000000</ns1:NumPCRBlk>
    <ns1:NumREJBlk>00000000</ns1:NumREJBlk>
    <ns1:FIToFICstmrDrctDbt>
        <ns5:GrpHdr>
            <ns5:MsgId>CHASDEFXXXX2017-10-20COR13140000003</ns5:MsgId>
            <ns5:CreDtTm>2017-10-20T13:14:32.020</ns5:CreDtTm>
            <ns5:NbOfTxs>1</ns5:NbOfTxs>
            <ns5:TtlIntrBkSttlmAmt Ccy="EUR">14.33</ns5:TtlIntrBkSttlmAmt>
            <ns5:IntrBkSttlmDt>2017-10-20</ns5:IntrBkSttlmDt>
            <ns5:SttlmInf>
                <ns5:SttlmMtd>CLRG</ns5:SttlmMtd>
                <ns5:ClrSys>
                    <ns5:Prtry>SCL</ns5:Prtry>
                </ns5:ClrSys>
            </ns5:SttlmInf>
            <ns5:InstdAgt>
                <ns5:FinInstnId>
                    <ns5:BIC>HYVEDEMXXX</ns5:BIC>
                </ns5:FinInstnId>
            </ns5:InstdAgt>
        </ns5:GrpHdr>
        <ns5:DrctDbtTxInf>
            <ns5:PmtId>
                <ns5:InstrId>2017-10-20-COR1314300000</ns5:InstrId>
                <ns5:EndToEndId>NotProvided</ns5:EndToEndId>
                <ns5:TxId>Test123</ns5:TxId>
            </ns5:PmtId>
            <ns5:PmtTpInf>
                <ns5:SvcLvl>
                    <ns5:Cd>SEPA</ns5:Cd>
                </ns5:SvcLvl>
                <ns5:LclInstrm>
                    <ns5:Cd>CORE</ns5:Cd>
                </ns5:LclInstrm>
                <ns5:SeqTp>RCUR</ns5:SeqTp>
            </ns5:PmtTpInf>
            <ns5:IntrBkSttlmAmt Ccy="EUR">14.33</ns5:IntrBkSttlmAmt>
            <ns5:ChrgBr>SLEV</ns5:ChrgBr>
            <ns5:ReqdColltnDt>2017-10-20</ns5:ReqdColltnDt>
            <ns5:DrctDbtTx>
                <ns5:MndtRltdInf>
                    <ns5:MndtId>AL1234567894</ns5:MndtId>
                    <ns5:DtOfSgntr>2013-01-03</ns5:DtOfSgntr>
                    <ns5:AmdmntInd>true</ns5:AmdmntInd>
                    <ns5:AmdmntInfDtls>
                        <ns5:OrgnlCdtrSchmeId>
                            <ns5:Nm>Test</ns5:Nm>
                            <ns5:Id>
                                <ns5:PrvtId>
                                    <ns5:Othr>
                                        <ns5:Id>DE98ZZZ09999999999</ns5:Id>
                                        <ns5:SchmeNm>
                                            <ns5:Prtry>SEPA</ns5:Prtry>
                                        </ns5:SchmeNm>
                                    </ns5:Othr>
                                </ns5:PrvtId>
                            </ns5:Id>
                        </ns5:OrgnlCdtrSchmeId>
                    </ns5:AmdmntInfDtls>
                </ns5:MndtRltdInf>
                <ns5:CdtrSchmeId>
                    <ns5:Id>
                        <ns5:PrvtId>
                            <ns5:Othr>
                                <ns5:Id>DE98ZZZ09999999999</ns5:Id>
                                <ns5:SchmeNm>
                                    <ns5:Prtry>SEPA</ns5:Prtry>
                                </ns5:SchmeNm>
                            </ns5:Othr>
                        </ns5:PrvtId>
                    </ns5:Id>
                </ns5:CdtrSchmeId>
            </ns5:DrctDbtTx>
            <ns5:Cdtr>
                <ns5:Nm>Test</ns5:Nm>
            </ns5:Cdtr>
            <ns5:CdtrAcct>
                <ns5:Id>
                    <ns5:IBAN>DE59501108006161508350</ns5:IBAN>
                </ns5:Id>
            </ns5:CdtrAcct>
            <ns5:CdtrAgt>
                <ns5:FinInstnId>
                    <ns5:BIC>CHASDEFXXXX</ns5:BIC>
                </ns5:FinInstnId>
            </ns5:CdtrAgt>
            <ns5:Dbtr>
                <ns5:Nm>Test</ns5:Nm>
            </ns5:Dbtr>
            <ns5:DbtrAcct>
                <ns5:Id>
                    <ns5:IBAN>DE16702203005100001146</ns5:IBAN>
                </ns5:Id>
            </ns5:DbtrAcct>
            <ns5:DbtrAgt>
                <ns5:FinInstnId>
                    <ns5:BIC>HYVEDEMXXX</ns5:BIC>
                </ns5:FinInstnId>
            </ns5:DbtrAgt>
            <ns5:UltmtDbtr/>
            <ns5:RmtInf>
                <ns5:Ustrd>Test ABC</ns5:Ustrd>
            </ns5:RmtInf>
        </ns5:DrctDbtTxInf>
    </ns1:FIToFICstmrDrctDbt>
</ns1:BBkDNFBlkDirDeb> 

这是我的XSLT-File:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:SCLSDD="urn:BBkDNF:xsd:BBkDNFBlkDirDeb" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="urn:BBkDNF:xsd:BBkDNFBlkDirDeb BBkDNFBlkDirDeb.xsd" 
xmlns:myTxNS="urn:iso:std:iso:20022:tech:xsd:sdd:pacs.003.001.02"
exclude-result-prefixes="myTxNS SCLSDD xsi">
    <!-- Namespace myTxNS erforderlich um in der Basis-pacs.003-XML-Datei auf die einzelnen Transaktionen unterhalb von SCLSDD:FIToFIPmtRvsl zugreifen zu können -->
    <xsl:output version="1.0" indent="yes" encoding="UTF-8" method="xml"/>
    <xsl:param name="_find_iban" required="no"/>
    <xsl:param name="_find_amount" required="no"/>
    <xsl:param name="_find_iban2" required="no"/>
    <xsl:param name="_find_amount2" required="no"/>
    <xsl:param name="_rjct_anzahl" required="no"/>
    <xsl:param name="_rjct_summe" required="no"/>
    <xsl:template match="/">
<BBkUDF:BBkUDFBlkDirDeb
namespace="urn:iso:std:iso:20022:tech:xsd:sdd:pacs.003.001.02"
xmlns:BBkUDF="urn:BBkUDF:xsd:BBkUDFBlkDirDeb" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="urn:BBkUDF:xsd:BBkUDFBlkDirDeb BBkUDFBlkDirDeb.xsd">
            <BBkUDF:SndgInst>MARKDEF0</BBkUDF:SndgInst>
            <!-- Sender ist immer BIC des SEPA Clearers im Test MARKDEF0 -->
            <!-- <RcvgInst>
                <xsl:value-of select="SCLSDD:BBkDNFBlkDirDeb/SCLSDD:SndgInst"/>
            </RcvgInst> -->
            <BBkUDF:RcvgInst>HYVEDEM0XXX</BBkUDF:RcvgInst>
            <!-- als Empfänger kann nur die XXX Bank sein -->
            <BBkUDF:SrvcId>
                <xsl:value-of select="/SCLSDD:BBkDNFBlkDirDeb/SCLSDD:SrvcId"/>
            </BBkUDF:SrvcId>
            <!-- COR für CORE und B2B für B2B -->
            <BBkUDF:TstCode>T</BBkUDF:TstCode>
            <!-- T für Test -->
            <BBkUDF:FType>UDF</BBkUDF:FType>
            <!-- UDF für "Result of Settlement File" -->
            <BBkUDF:FileRef>
                <xsl:value-of select="format-dateTime(current-dateTime(),'[Y0001][M01][D01]P2[H01][m01][s01]')"/>
                <!-- erzeugt eine 16stellige Filereferenz auf Basis aktuellem Datum damit es eindeutig ist und stellt eine Referenz des SEPA Clearers dar -->
            </BBkUDF:FileRef>
            <BBkUDF:RoutingInd>ALL</BBkUDF:RoutingInd>
            <!-- ALL ist Standard für UDF -->
            <BBkUDF:FileBusDt>
                <xsl:value-of select="format-dateTime(current-dateTime(),'[Y0001]-[M01]-[D01]')"/>
                <!-- Erstelldatum der Datei -->
            </BBkUDF:FileBusDt>
            <BBkUDF:FileCycleNo>05</BBkUDF:FileCycleNo>
            <BBkUDF:FIToFICstmrDrctDbt>
                <GrpHdr>
                    <MsgId>
                        <xsl:value-of select="/SCLSDD:BBkDNFBlkDirDeb/SCLSDD:FIToFICstmrDrctDbt/myTxNS:GrpHdr/myTxNS:MsgId"/>
                    </MsgId>
                    <CreDtTm>
                        <xsl:value-of select="/SCLSDD:BBkDNFBlkDirDeb/SCLSDD:FIToFICstmrDrctDbt/myTxNS:GrpHdr/myTxNS:CreDtTm"/>
                    </CreDtTm>
                    <NbOfTxs>
                        <xsl:value-of select="$_rjct_anzahl"/>
                    </NbOfTxs>
                    <TtlIntrBkSttlmAmt Ccy="EUR">
                        <xsl:value-of select="$_rjct_summe"/>
                    </TtlIntrBkSttlmAmt>
                    <IntrBkSttlmDt>
                        <xsl:value-of select="/SCLSDD:BBkDNFBlkDirDeb/SCLSDD:FIToFICstmrDrctDbt/myTxNS:GrpHdr/myTxNS:IntrBkSttlmDt"/>
                    </IntrBkSttlmDt>
                    <SttlmInf>
                        <SttlmMtd>CLRG</SttlmMtd>
                        <ClrSys>
                            <Prtry>SCL</Prtry>
                        </ClrSys>
                    </SttlmInf>
                    <InstdAgt>
                        <FinInstnId>
                            <BIC>HYVEDEMXXX</BIC>
                        </FinInstnId>
                    </InstdAgt>
                </GrpHdr>
                <xsl:variable name="all_TxInf_Nodes" select="SCLSDD:BBkDNFBlkDirDeb/SCLSDD:FIToFICstmrDrctDbt/myTxNS:DrctDbtTxInf"/>
                <xsl:for-each select="$all_TxInf_Nodes">
                    <!-- hier muss per If-Anweisung ermittelt werden, ob die Zahlung übernommen werden soll -->
                    <xsl:variable name="betrag" select="myTxNS:IntrBkSttlmAmt"/>
                    <xsl:variable name="iban" select="myTxNS:DbtrAcct/myTxNS:Id/myTxNS:IBAN"/>
                    <xsl:if test="(number($betrag)=number($_find_amount) and $iban=$_find_iban)">
                        <xsl:variable name="betrag" select="myTxNS:IntrBkSttlmAmt"/>
                        <!-- ermittelt den Betrag der Zahlung -->
                        <DrctDbtTxInf>
                            <xsl:apply-templates select="myTxNS:PmtId"/>
                            <xsl:apply-templates select="myTxNS:PmtTpInf"/>
                            <IntrBkSttlmAmt Ccy="EUR">
                                <xsl:value-of select="myTxNS:IntrBkSttlmAmt"/>
                            </IntrBkSttlmAmt>
                            <xsl:apply-templates select="myTxNS:ChrgBr"/>
                            <xsl:apply-templates select="myTxNS:ReqdColltnDt"/>
                            <xsl:apply-templates select="myTxNS:DrctDbtTx"/>
                            <xsl:apply-templates select="myTxNS:Cdtr"/>
                            <xsl:apply-templates select="myTxNS:CdtrAcct"/>
                            <xsl:apply-templates select="myTxNS:CdtrAgt"/>
                            <xsl:apply-templates select="myTxNS:UltmtCdtr"/>
                            <xsl:apply-templates select="myTxNS:InstgAgt"/>
                            <xsl:apply-templates select="myTxNS:Dbtr"/>
                            <xsl:apply-templates select="myTxNS:DbtrAcct"/>
                            <xsl:apply-templates select="myTxNS:DbtrAgt"/>
                            <xsl:apply-templates select="myTxNS:UltmDbtr"/>
                            <xsl:apply-templates select="myTxNS:Purp"/>
                            <xsl:apply-templates select="myTxNS:RmtInf"/>
                        </DrctDbtTxInf>
                    </xsl:if>
                </xsl:for-each>
                <xsl:for-each select="$all_TxInf_Nodes">
                    <!-- hier muss per If-Anweisung ermittelt werden, ob die Zahlung übernommen werden soll -->
                    <xsl:variable name="betrag" select="myTxNS:IntrBkSttlmAmt"/>
                    <xsl:variable name="iban" select="myTxNS:DbtrAcct/myTxNS:Id/myTxNS:IBAN"/>
                    <xsl:if test="(number($betrag)=number($_find_amount2) and $iban=$_find_iban2)">
                        <xsl:variable name="betrag" select="myTxNS:IntrBkSttlmAmt"/>
                        <!-- ermittelt den Betrag der Zahlung -->
                        <DrctDbtTxInf>
                            <xsl:apply-templates select="myTxNS:PmtId"/>
                            <xsl:apply-templates select="myTxNS:PmtTpInf"/>
                            <IntrBkSttlmAmt Ccy="EUR">
                                <xsl:value-of select="myTxNS:IntrBkSttlmAmt"/>
                            </IntrBkSttlmAmt>
                            <xsl:apply-templates select="myTxNS:ChrgBr"/>
                            <xsl:apply-templates select="myTxNS:ReqdColltnDt"/>
                            <xsl:apply-templates select="myTxNS:DrctDbtTx"/>
                            <xsl:apply-templates select="myTxNS:Cdtr"/>
                            <xsl:apply-templates select="myTxNS:CdtrAcct"/>
                            <xsl:apply-templates select="myTxNS:CdtrAgt"/>
                            <xsl:apply-templates select="myTxNS:UltmtCdtr"/>
                            <xsl:apply-templates select="myTxNS:InstgAgt"/>
                            <xsl:apply-templates select="myTxNS:Dbtr"/>
                            <xsl:apply-templates select="myTxNS:DbtrAcct"/>
                            <xsl:apply-templates select="myTxNS:DbtrAgt"/>
                            <xsl:apply-templates select="myTxNS:UltmDbtr"/>
                            <xsl:apply-templates select="myTxNS:Purp"/>
                            <xsl:apply-templates select="myTxNS:RmtInf"/>
                        </DrctDbtTxInf>
                    </xsl:if>
                </xsl:for-each>
            </BBkUDF:FIToFICstmrDrctDbt>
        </BBkUDF:BBkUDFBlkDirDeb>
    </xsl:template>
    <xsl:template match="myTxNS:*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="node()"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="myTxNS:*/*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

这是输出文件的第一部分(其余部分是正确的):

<?xml version="1.0" encoding="UTF-8"?>
<BBkUDF:BBkUDFBlkDirDeb xmlns:BBkUDF="urn:BBkUDF:xsd:BBkUDFBlkDirDeb"
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        namespace="urn:iso:std:iso:20022:tech:xsd:sdd:pacs.003.001.02"
                        xsi:schemaLocation="urn:BBkUDF:xsd:BBkUDFBlkDirDeb BBkUDFBlkDirDeb.xsd">

这是达到的目标:

<?xml version="1.0" encoding="UTF-8"?>
<BBkUDF:BBkUDFBlkDirDeb xmlns:BBkUDF="urn:BBkUDF:xsd:BBkUDFBlkDirDeb"
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns="urn:iso:std:iso:20022:tech:xsd:sdd:pacs.003.001.02"
                        xsi:schemaLocation="urn:BBkUDF:xsd:BBkUDFBlkDirDeb BBkUDFBlkDirDeb.xsd">

正如您所看到的,两个结果之间的唯一区别是“命名空间”,我用它将输入文件的其余部分正确地传输到输出文件。

如果我(在xslt文件中)将“namespace”(占位符)中的值更改为预期的“xmlns”,则完整生成的文件已损坏。在不同的级别上,标签“xmlns =”“”放在不应该的位置:(

我只需要在目标/输出文件中使用以下Schema-Declaration:

<BBkUDF:BBkUDFBlkDirDeb xsi:schemaLocation="urn:BBkUDF:xsd:BBkUDFBlkDirDeb BBkUDFBlkDirDeb.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:BBkUDF="urn:BBkUDF:xsd:BBkUDFBlkDirDeb" xmlns="urn:iso:std:iso:20022:tech:xsd:sdd:pacs.003.001.02">

就是这样。

如果我再次写“难”,请不要犹豫,给我一个反馈。 谢谢&amp; BR 基督徒

1 个答案:

答案 0 :(得分:1)

xmlns="urn:iso:std:iso:20022:tech:xsd:sdd:pacs.003.001.02"元素上移动<xsl:stylesheet,然后应避免使用xmlns=""我认为您使用最后两个模板创建的元素。