XSLT转换 - 重复结构导致值的汇总

时间:2017-11-02 18:22:41

标签: xml xslt

我需要帮助解决我的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;如何解决这个问题。但是我总是得到输出文件中组合值的相同结果。

1 个答案:

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