我需要帮助解决我的XSLT-Transformation中的另一个问题。
我的输入文件中有一些具有不同值的重复结构。
<Dbtr>
<Nm>TEST BANK GMBH</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE07702203005401252462</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>TESTBDEM0XXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>HYVEDEMM475</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>Name 1</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE92660202860002099551</IBAN>
</Id>
</CdtrAcct>
<Dbtr>
<Nm>Name 2</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE88702203005002522901</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>TESTBDEM0XXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>HYVEDEMMXXX</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>FIRMA X</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE39700202704320253727</IBAN>
</Id>
</CdtrAcct>
这是XSLT-File的一部分:
<OrgnlTxRef>
<xsl:if test="position()=1">
<IntrBkSttlmAmt Ccy="EUR">
<xsl:value-of select="$_find_amount"/>
</IntrBkSttlmAmt>
<IntrBkSttlmDt>
<xsl:for-each select="//myTxNS:TxInfAndSts/myTxNS:OrgnlTxRef/myTxNS:IntrBkSttlmDt[not(.=preceding::*)]">
<xsl:value-of select="."/>
</xsl:for-each>
</IntrBkSttlmDt>
<DbtrAgt>
<FinInstnId>
<BIC>TESTBDEM0XXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>
<xsl:for-each select="//myTxNS:TxInfAndSts/myTxNS:OrgnlTxRef/myTxNS:CdtrAgt/myTxNS:FinInstnId/myTxNS:BIC">
<xsl:value-of select="."/>
</xsl:for-each>
</BIC>
</FinInstnId>
</CdtrAgt>
</xsl:if>
<xsl:if test="position()=2">
<IntrBkSttlmAmt Ccy="EUR">
<xsl:value-of select="$_find_amount2"/>
</IntrBkSttlmAmt>
<IntrBkSttlmDt>
<xsl:for-each select="//myTxNS:TxInfAndSts/myTxNS:OrgnlTxRef/myTxNS:IntrBkSttlmDt[not(.=preceding::*)]">
<xsl:value-of select="."/>
</xsl:for-each>
</IntrBkSttlmDt>
<DbtrAgt>
<FinInstnId>
<BIC>TESTBDEM0XXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>
<xsl:for-each select="//myTxNS:TxInfAndSts/myTxNS:OrgnlTxRef/myTxNS:CdtrAgt/myTxNS:FinInstnId/myTxNS:BIC">
<xsl:value-of select="."/>
</xsl:for-each>
</BIC>
</FinInstnId>
</CdtrAgt>
</xsl:if>
</OrgnlTxRef>
我的实际结果是:
<OrgnlTxRef>
<IntrBkSttlmAmt Ccy="EUR">8.28</IntrBkSttlmAmt>
<IntrBkSttlmDt>2017-10-26</IntrBkSttlmDt>
<DbtrAgt>
<FinInstnId>
<BIC>TESTBDEM0XXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>HYVEDEMM475HYVEDEMMXXX</BIC>
</FinInstnId>
</CdtrAgt>
<DbtrAgt>
<FinInstnId>
<BIC>TESTBDEM0XXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>HYVEDEMM475HYVEDEMMXXX</BIC>
</FinInstnId>
</CdtrAgt>
</OrgnlTxRef>
</TxInfAndSts>
</nsC:FIToFIPmtStsRptSCL>
</nsC:BBkRSFBlkDirDeb>
我需要一些东西来避免这种情况:
<FinInstnId>
<BIC>HYVEDEMM475HYVEDEMMXXX</BIC>
</FinInstnId>
并且有一个明确的结果:
...
<FinInstnId>
<BIC>HYVEDEMMXXX</BIC>
</FinInstnId>
...
...
<FinInstnId>
<BIC>HYVEDEMM475</BIC>
</FinInstnId>
...
我搜索了这个页面并尝试了不同的想法&#34;如何解决这个问题。但是我总是得到输出文件中组合值的相同结果。
答案 0 :(得分:0)
问题在于这些行
Iterable<String> filter(Iterable<String> foos) {
return Iterables.filter(foos,
input -> input.equals("whatever");
}
首先,当您使用<BIC>
<xsl:for-each select="//myTxNS:TxInfAndSts/myTxNS:OrgnlTxRef/myTxNS:CdtrAgt/myTxNS:FinInstnId/myTxNS:BIC">
<xsl:value-of select="."/>
</xsl:for-each>
</BIC>
启动表达式时,这将在文档节点处开始搜索,并在XML中的任何位置查找元素。我猜你想要的只是选择相对于你当前节点的元素。
我认为你已经从你的XSLT中删除了太多,但我认为在这个代码运行的时候你位于//
元素上,所以表达式应该就是这样。
myTxNS:TxInfAndSts
此外,您可能希望在<xsl:for-each select="myTxNS:OrgnlTxRef/myTxNS:CdtrAgt/myTxNS:FinInstnId/myTxNS:BIC">
内移动<BIC>
标记的创建。
xsl:for-each