我的输入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的新手。
提前致谢
(如果您需要我的更多信息,请告诉我)
答案 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>