xsl для каждого в группе для каждого - PullRequest
0 голосов
/ 15 ноября 2018

Я новичок в xsl.Я понимаю, что были заданы некоторые похожие вопросы, но мне нужна помощь, так как я не могу понять, что случилось с моим кодом.У меня есть XML-файл транзакций.Я хочу сначала сгруппировать по дате, а затем отсортировать каждую группу транзакций по времени

У меня есть этот xml

<History>
    <ShareLoanResults>
        <Account>123</Account>
        <PostingDt>20180718</PostingDt>
        <PostingTime>215642</PostingTime>
        <AmtLoan>000000000</AmtLoan>
        <AmtShare>000000001</AmtShare>
        <AmtInt>000000000</AmtInt>
        <Balance>000000487</Balance>
        <Description />
    </ShareLoanResults>
    <ShareLoanResults>
        <Account>123</Account>
        <PostingDt>20180719</PostingDt>
        <PostingTime>215650</PostingTime>
        <AmtLoan>000000000</AmtLoan>
        <AmtShare>000000003</AmtShare>
        <AmtInt>000000000</AmtInt>
        <Balance>000000494</Balance>
        <Description />
    </ShareLoanResults>
    <ShareLoanResults>
        <Account>123</Account>
        <PostingDt>20180719</PostingDt>
        <PostingTime>215640</PostingTime>
        <AmtLoan>000000000</AmtLoan>
        <AmtShare>000000002</AmtShare>
        <AmtInt>000000000</AmtInt>
        <Balance>000000489</Balance>
        <Description />
    </ShareLoanResults>
    <ShareLoanResults>
        <Account>123</Account>
        <PostingDt>20180717</PostingDt>
        <PostingTime>215641</PostingTime>
        <AmtLoan>000000000</AmtLoan>
        <AmtShare>000000004</AmtShare>
        <AmtInt>000000000</AmtInt>
        <Balance>000000486</Balance>
        <Description />
    </ShareLoanResults>
</History>

Я ищу этот результат

<History>
<ShareLoanResults>
    <Order>1</Order>
    <Account>123</Account>
    <PostingDt>20180717</PostingDt>
    <PostingTime>215641</PostingTime>
    <Amount>4</Amount>
</ShareLoanResults>
<ShareLoanResults>
    <Order>1</Order>
    <Account>123</Account>
    <PostingDt>20180718</PostingDt>
    <PostingTime>215642</PostingTime>
    <Amount>1</Amount>
</ShareLoanResults>
<ShareLoanResults>
    <Order>1</Order>
    <Account>123</Account>
    <PostingDt>20180719</PostingDt>
    <PostingTime>215640</PostingTime>
    <Amount>3</Amount>
</ShareLoanResults>
<ShareLoanResults>
    <Order>2</Order>
    <Account>123</Account>
    <PostingDt>20180719</PostingDt>
    <PostingTime>215650</PostingTime>
    <Amount>3</Amount>
</ShareLoanResults>
</History>

Вот мой xsl

<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="xml" omit-xml-declaration="no" />

<xsl:template match="/">      
<xsl:copy>
    <xsl:for-each-group select="History/ShareLoanResults" group-by="PostingDt">
            <xsl:for-each select="current-group()">
            <xsl:sort select="PostingTime" order="ascending"/>
                <ShareLoanResults>
                    <Order>
                        <xsl:value-of select="position()"/>
                    </Order>
                    <Account>
                        <xsl:value-of select="Account"/>
                    </Account>
                    <PostingDt>
                        <xsl:value-of select="PostingDt"/>
                    </PostingDt>    
                    <PostingTime>
                        <xsl:value-of select="PostingTime"/>
                    </PostingTime>  
                    <Amount>
                        <xsl:value-of select="format-number(AmtShare,'#.000000')"/>
                    </Amount>
                </ShareLoanResults>
            </xsl:for-each>  
    </xsl:for-each-group>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

Однако я получаю исключение: javax.xml.transform.TransformerException: Не удалось найти функцию: current-group

Если я удаляю <xsl:for-each-group select="current-group()"> и соответствующий закрытый тег, я получаю пустой результат ниже

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ShareLoanResults><Order/><Account/><PostingDt/><PostingTime/><Amount>NaN</Amount></ShareLoanResults>

Может кто-нибудь сказать мне, что я сделал не так и / или пропустил?Спасибо!

1 Ответ

0 голосов
/ 15 ноября 2018

Как уже упоминали наши гуру XSLT, вам не нужна группировка или процессор 2.0. Просто отсортируйте по дате и времени, и у Порядка числа узлов будут следующие братья и сестры с той же датой:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="/History">   
      <xsl:copy>   
        <xsl:apply-templates select="ShareLoanResults">
            <xsl:sort select="PostingDt"/>
            <xsl:sort select="PostingTime"/>
        </xsl:apply-templates>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="ShareLoanResults">      
        <xsl:variable name="curr_dt" select="PostingDt"/>
        <xsl:copy>
            <Order>
                <xsl:value-of select="count(following-sibling::*[PostingDt=$curr_dt])+1"/>
            </Order>
            <Account>
                <xsl:value-of select="Account"/>
            </Account>
            <PostingDt>
                <xsl:value-of select="PostingDt"/>
            </PostingDt>    
            <PostingTime>
                <xsl:value-of select="PostingTime"/>
            </PostingTime>  
            <Amount>
                <xsl:value-of select="format-number(AmtShare,'#.000000')"/>
            </Amount>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

XSLT Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...