XML格式 - 选择现有xml的子集以使用xslt创建新的xml

时间:2016-12-28 02:22:06

标签: 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>

我想从这个XML中提取一个子集,我的预期输出应该如下所示:

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

我能够使用XSLT

实现这一目标
<?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 xsi">
    <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">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

但除此之外,要求是替换

"od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:Chrgs" 

od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:Chrgs

od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:AddtlNtryInf

包含文字&#34; ENRICHED&#34;和

od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:Btch 

存在

所以基本上我希望实现以下

When input xml element = od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls
  Start copying the child tags
  While copying the tags, if element = od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:Chrgs
   if "od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:AddtlNtryInf" contains'ENRICHED' and "od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:Btch" is present
   Copy all elements under "od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:Chrgs"
  else
   Copy all elements under "od:Document/od:BkToCstmrDbtCdtNtfctn/od:Ntfctn/od:Ntry/od:NtryDtls/od:TxDtls/od:Chrgs"

需要帮助解决这个问题。它可能很简单,但我是XML的新手。

提前致谢

(如果您需要我的更多信息,请告诉我)

1 个答案:

答案 0 :(得分:0)

最好从身份模板开始处理复制现有节点,而不是使用xsl:copy-of

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

然后,如果您只想提取od:TxDtls个节点,则必须明确选择它,忽略您不想要的节点。

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

就您的逻辑而言,您只需要一个模板,如果您想从其他地方复制Chrgs(即AddtlNtryInf包含&#34; ENRICHED&#34;和Btch已存在),因为身份模板已经涵盖了&#34;否则&#34;条件。

<xsl:template match="od:TxDtls/od:Chrgs[contains(../../../od:AddtlNtryInf, 'ENRICHED') and  ../../od:Btch]">
    <xsl:apply-templates select="../../../od:Chrgs" />
</xsl:template>

因此,模板匹配包含您要检查的条件,如果尝试,则会从其他位置复制Chrgs

试试这个XSLT

<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" />
    <xsl:strip-space elements="*" />

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

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

    <xsl:template match="od:TxDtls/od:Chrgs[contains(../../../od:AddtlNtryInf, 'ENRICHED') and  ../../od:Btch]">
        <xsl:apply-templates select="../../../od:Chrgs" />
    </xsl:template>
</xsl:stylesheet>

编辑 - 如果您还希望输出XML中的元素不在命名空间中(而不是在命名空间中&#39; urn:iso:std:iso:20022:tech: xsd:camt.054.001.02&#39;根据输入),将此模板添加到XSLT以覆盖标识模板,并在无命名空间中输出新元素。

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