使用XSLT从单个父级提取子节点并重新格式化

时间:2016-12-28 23:19:47

标签: xml xslt

我输入的XML为

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02">
    <BkToCstmrDbtCdtNtfctn>
        <GrpHdr>
            <MsgId>FRDA000003421606</MsgId>
            <AddtlInf>BatchAccounting</AddtlInf>
        </GrpHdr>
        <Ntfctn>
            <Id>AC730486180000000002</Id>
            <ElctrncSeqNb>1234</ElctrncSeqNb>
            <Acct>
                <Svcr>
                    <FinInstnId>
                        <Othr>
                            <Id>40457258</Id>
                        </Othr>
                    </FinInstnId>
                </Svcr>
            </Acct>
            <Ntry>
                <Amt Ccy="EUR">126</Amt>
                <CdtDbtInd>CRDT</CdtDbtInd>
                <Sts>BOOK</Sts>
                <BkTxCd>
                    <Domn>
                        <Cd>PMNT</Cd>
                        <Fmly>
                            <Cd>RDDT</Cd>
                            <SubFmlyCd>ESDD</SubFmlyCd>
                        </Fmly>
                    </Domn>
                    <Prtry>
                        <Issr>SWIFT</Issr>
                    </Prtry>
                </BkTxCd>
                <AmtDtls>
                    <InstdAmt>
                        <Amt Ccy="EUR">126</Amt>
                        <CcyXchg/>
                    </InstdAmt>
                    <TxAmt>
                        <Amt Ccy="EUR">126</Amt>
                        <CcyXchg/>
                    </TxAmt>
                    <CntrValAmt>
                        <Amt Ccy="EUR">126</Amt>
                        <CcyXchg/>
                    </CntrValAmt>
                </AmtDtls>
                <Chrgs>
                    <TtlChrgsAndTaxAmt Ccy="AAA">0</TtlChrgsAndTaxAmt>
                    <Amt Ccy="AAA">0</Amt>
                    <CdtDbtInd>DBIT</CdtDbtInd>
                    <Tp>
                        <Cd>COMM</Cd>
                    </Tp>
                    <Rate>0</Rate>
                    <Br>SLEV</Br>
                    <Pty>
                        <FinInstnId>
                            <BIC>AAAAAA20</BIC>
                            <ClrSysMmbId>
                                <ClrSysId>
                                    <Cd>a</Cd>
                                </ClrSysId>
                                <MmbId>a</MmbId>
                            </ClrSysMmbId>
                            <Nm>a</Nm>
                            <PstlAdr>
                                <AdrTp>MLTO</AdrTp>
                                <Dept>a</Dept>
                                <SubDept>a</SubDept>
                                <StrtNm>a</StrtNm>
                                <BldgNb>a</BldgNb>
                                <PstCd>a</PstCd>
                                <TwnNm>a</TwnNm>
                                <CtrySubDvsn>a</CtrySubDvsn>
                                <Ctry>AA</Ctry>
                                <AdrLine>a</AdrLine>
                            </PstlAdr>
                            <Othr>
                                <Id>a</Id>
                                <SchmeNm>
                                    <Cd>a</Cd>
                                </SchmeNm>
                                <Issr>a</Issr>
                            </Othr>
                        </FinInstnId>
                        <BrnchId>
                            <Id>a</Id>
                            <Nm>a</Nm>
                            <PstlAdr>
                                <AdrTp>ADDR</AdrTp>
                                <Dept>a</Dept>
                                <SubDept>a</SubDept>
                                <StrtNm>a</StrtNm>
                                <BldgNb>a</BldgNb>
                                <PstCd>a</PstCd>
                                <TwnNm>a</TwnNm>
                                <CtrySubDvsn>a</CtrySubDvsn>
                                <Ctry>AA</Ctry>
                                <AdrLine>a</AdrLine>
                            </PstlAdr>
                        </BrnchId>
                    </Pty>
                    <Tax>
                        <Id>a</Id>
                        <Rate>0</Rate>
                        <Amt Ccy="AAA">0</Amt>
                    </Tax>
                </Chrgs>
                <NtryDtls>
                    <Btch>
                        <MsgId>FG00000000000y88sd</MsgId>
                        <NbOfTxs>2</NbOfTxs>
                    </Btch>
                    <TxDtls>
                        <Refs>
                            <AcctSvcrRef>FRDA00000342</AcctSvcrRef>
                            <EndToEndId>E2E220161205123001</EndToEndId>
                            <TxId>FRDA00004341</TxId>
                            <MndtId>MANsecT1COR1201006</MndtId>
                        </Refs>
                        <AmtDtls/>
                        <Chrgs>
                            <TtlChrgsAndTaxAmt Ccy="BBB">0</TtlChrgsAndTaxAmt>
                            <Amt Ccy="BBB">0</Amt>
                            <CdtDbtInd>DBIT</CdtDbtInd>
                            <Tp>
                                <Cd>COMM</Cd>
                            </Tp>
                            <Rate>0</Rate>
                            <Br>SLEV</Br>
                            <Pty>
                                <FinInstnId>
                                    <BIC>BBBBB20</BIC>
                                    <ClrSysMmbId>
                                        <ClrSysId>
                                            <Cd>b</Cd>
                                        </ClrSysId>
                                        <MmbId>b</MmbId>
                                    </ClrSysMmbId>
                                    <Nm>b</Nm>
                                    <PstlAdr>
                                        <AdrTp>MLTO</AdrTp>
                                        <Dept>b</Dept>
                                        <SubDept>b</SubDept>
                                        <StrtNm>b</StrtNm>
                                        <BldgNb>b</BldgNb>
                                        <PstCd>b</PstCd>
                                        <TwnNm>b</TwnNm>
                                        <CtrySubDvsn>b</CtrySubDvsn>
                                        <Ctry>BB</Ctry>
                                        <AdrLine>b</AdrLine>
                                    </PstlAdr>
                                    <Othr>
                                        <Id>b</Id>
                                        <SchmeNm>
                                            <Cd>b</Cd>
                                        </SchmeNm>
                                        <Issr>b</Issr>
                                    </Othr>
                                </FinInstnId>
                                <BrnchId>
                                    <Id>b</Id>
                                    <Nm>b</Nm>
                                    <PstlAdr>
                                        <AdrTp>bDDR</AdrTp>
                                        <Dept>b</Dept>
                                        <SubDept>b</SubDept>
                                        <StrtNm>b</StrtNm>
                                        <BldgNb>b</BldgNb>
                                        <PstCd>b</PstCd>
                                        <TwnNm>b</TwnNm>
                                        <CtrySubDvsn>b</CtrySubDvsn>
                                        <Ctry>BB</Ctry>
                                        <AdrLine>b</AdrLine>
                                    </PstlAdr>
                                </BrnchId>
                            </Pty>
                            <Tax>
                                <Id>b</Id>
                                <Rate>0</Rate>
                                <Amt Ccy="BBB">0</Amt>
                            </Tax>
                        </Chrgs>
                        <RltdPties>
                            <Cdtr>
                                <Nm>Creditor 1</Nm>
                                <PstlAdr>
                                    <Ctry>PT</Ctry>
                                    <AdrLine>TEST TEST</AdrLine>
                                    <AdrLine>TEST TEST</AdrLine>
                                </PstlAdr>
                                <CtryOfRes>PT</CtryOfRes>
                            </Cdtr>
                            <CdtrAcct>
                                <Id>
                                    <IBAN>FR7630588000010050000143176</IBAN>
                                </Id>
                            </CdtrAcct>
                        </RltdPties>
                        <RltdDts>
                            <AccptncDtTm>2016-12-06T04:01:10</AccptncDtTm>
                            <IntrBkSttlmDt>2016-12-07</IntrBkSttlmDt>
                        </RltdDts>
                        <AddtlTxInf/>
                    </TxDtls>
                    <TxDtls>
                        <Refs>
                            <AcctSvcrRef>FRDA00000343</AcctSvcrRef>
                            <EndToEndId>E2E120161205123003</EndToEndId>
                            <TxId>FRDA00003343</TxId>
                            <MndtId>MANFRST1COR1201003</MndtId>
                        </Refs>
                        <AmtDtls/>
                        <RltdPties>
                            <Cdtr>
                                <Nm>Creditor 1</Nm>
                                <PstlAdr>
                                    <Ctry>PT</Ctry>
                                    <AdrLine>TEST TEST</AdrLine>
                                    <AdrLine>TEST TEST</AdrLine>
                                </PstlAdr>
                                <CtryOfRes>PT</CtryOfRes>
                            </Cdtr>
                            <CdtrAcct>
                                <Id>
                                    <IBAN>FR7630588000010050000143176</IBAN>
                                </Id>
                            </CdtrAcct>
                        </RltdPties>
                        <RltdDts>
                            <AccptncDtTm>2016-12-06T04:01:10</AccptncDtTm>
                            <IntrBkSttlmDt>2016-12-07</IntrBkSttlmDt>
                        </RltdDts>
                        <AddtlTxInf/>
                    </TxDtls>
                </NtryDtls>
                <AddtlNtryInf>ENRICHED|TRUE SETT_METHOD|SEPA IAT_IND|FALSE DOMESTIC_IND|FALSE PRIORITY_IND|FALSE</AddtlNtryInf>
            </Ntry>
        </Ntfctn>
    </BkToCstmrDbtCdtNtfctn>
</Document>

我正在尝试从父节点TxDtls中提取子元素,其中TxDtls可以在输入XML中出现1次或多次。下面是我尝试使用的XLST

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:od="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02" exclude-result-prefixes="od">

  <xsl:output method="xml" indent="no" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="od:*"/>

   <xsl:template match="@* | node()" name="TransactionDetails">
       <xsl:apply-templates/>
     </xsl:template>


     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:Refs">
     <xsl:copy-of select="."/>
     <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:AmtDtls">
     <xsl:copy-of select="."/>
     <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:Avlbty">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:BkTxCd">
     <xsl:copy-of select="."/>
     <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:Chrgs">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:Intrst">
     <xsl:copy-of select="."/>
     <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:RltdPties">
     <xsl:copy-of select="."/>
     <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:RltdAgts">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:Purp">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:RltdRmtInf">
     <xsl:copy-of select="."/>
      <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:RmtInf">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:RltdDts">
     <xsl:copy-of select="."/>
     <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:RltdPric">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:RltdQties">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:FinInstrmId">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:Tax">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:RtrInf">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:CorpActn">
     <xsl:copy-of select="."/>    
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:SfkpgAcct">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

     <xsl:template match="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:AddtlTxInf">
       <xsl:copy-of select="."/>
       <xsl:text>TGST</xsl:text>
   </xsl:template>

</xsl:stylesheet>

预期输出为:

<Refs xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><AcctSvcrRef>FRDA00000342</AcctSvcrRef><EndToEndId>E2E220161205123001</EndToEndId><TxId>FRDA00004341</TxId><MndtId>MANsecT1COR1201006</MndtId></Refs>TGST<AmtDtls xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"/>TGST<Chrgs xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><TtlChrgsAndTaxAmt Ccy="BBB">0</TtlChrgsAndTaxAmt><Amt Ccy="BBB">0</Amt><CdtDbtInd>DBIT</CdtDbtInd><Tp><Cd>COMM</Cd></Tp><Rate>0</Rate><Br>SLEV</Br><Pty><FinInstnId><BIC>BBBBB20</BIC><ClrSysMmbId><ClrSysId><Cd>b</Cd></ClrSysId><MmbId>b</MmbId></ClrSysMmbId><Nm>b</Nm><PstlAdr><AdrTp>MLTO</AdrTp><Dept>b</Dept><SubDept>b</SubDept><StrtNm>b</StrtNm><BldgNb>b</BldgNb><PstCd>b</PstCd><TwnNm>b</TwnNm><CtrySubDvsn>b</CtrySubDvsn><Ctry>BB</Ctry><AdrLine>b</AdrLine></PstlAdr><Othr><Id>b</Id><SchmeNm><Cd>b</Cd></SchmeNm><Issr>b</Issr></Othr></FinInstnId><BrnchId><Id>b</Id><Nm>b</Nm><PstlAdr><AdrTp>bDDR</AdrTp><Dept>b</Dept><SubDept>b</SubDept><StrtNm>b</StrtNm><BldgNb>b</BldgNb><PstCd>b</PstCd><TwnNm>b</TwnNm><CtrySubDvsn>b</CtrySubDvsn><Ctry>BB</Ctry><AdrLine>b</AdrLine></PstlAdr></BrnchId></Pty><Tax><Id>b</Id><Rate>0</Rate><Amt Ccy="BBB">0</Amt></Tax></Chrgs>TGST<RltdPties xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><Cdtr><Nm>Creditor 1</Nm><PstlAdr><Ctry>PT</Ctry><AdrLine>TEST TEST</AdrLine><AdrLine>TEST TEST</AdrLine></PstlAdr><CtryOfRes>PT</CtryOfRes></Cdtr><CdtrAcct><Id><IBAN>FR7630588000010050000143176</IBAN></Id></CdtrAcct></RltdPties>TGST<RltdDts xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><AccptncDtTm>2016-12-06T04:01:10</AccptncDtTm><IntrBkSttlmDt>2016-12-07</IntrBkSttlmDt></RltdDts>TGST<AddtlTxInf xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"/>TGST<Refs xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><AcctSvcrRef>FRDA00000343</AcctSvcrRef><EndToEndId>E2E120161205123003</EndToEndId><TxId>FRDA00003343</TxId><MndtId>MANFRST1COR1201003</MndtId></Refs>TGST<AmtDtls xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"/>TGST<RltdPties xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><Cdtr><Nm>Creditor 1</Nm><PstlAdr><Ctry>PT</Ctry><AdrLine>TEST TEST</AdrLine><AdrLine>TEST TEST</AdrLine></PstlAdr><CtryOfRes>PT</CtryOfRes></Cdtr><CdtrAcct><Id><IBAN>FR7630588000010050000143176</IBAN></Id></CdtrAcct></RltdPties>TGST<RltdDts xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><AccptncDtTm>2016-12-06T04:01:10</AccptncDtTm><IntrBkSttlmDt>2016-12-07</IntrBkSttlmDt></RltdDts>TGST<AddtlTxInf xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"/>TGST

我得到了预期的输出但是有了命名空间。我想删除命名空间。

需要输入构建XSLT才能获得所需的内容。

提前感谢

更新了XLST

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:od="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02" exclude-result-prefixes="od">

  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="od:*"/>

    <xsl:template match="*" priority="2">
    <xsl:element name="{local-name()}">        
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
    </xsl:teqmplate>

    <xsl:template match="@*|node()">
      <xsl:copy-of select="."/>
      <xsl:text>TGST</xsl:text>
    </xsl:template>

    <xsl:template match="/">
        <xsl:apply-templates select="od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/*" />
    </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

您需要将文本元素放在其他位置:

<xsl:template match="*" priority="2">
  <xsl:text>TGST</xsl:text>
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>