2016-01-14 3 views
0

Я работаю над созданием текстового выходного файла из xml. Элементы XML будут иметь узел, называемый LoanAmt, значение которого может быть 0 или больше нуля. Теперь я должен проверить два условия, первое из которых заключается в том, чтобы узнать, больше ли значение LoanAmt больше 0, а затем, если это нужно, я должен подвести итоги LoanAmt, если для уникального Участника enntries. Другими словами, если есть только один идентификатор участника во всем xml, тогда отобразите вывод, но если имеется более одного идентификатора Partcipant, тогда должна быть заполнена только одна запись для каждого уникального идентификатора Particpant, но LoanAmt в каждом уникальном идентификаторе Particpant должен быть суммирован вверх и отображается. Моя проблема в том, что мой xslt работает так же, как я хочу, но groupby и если условие не работает над первой записью xml, где Loan Amt не больше нуля. Итак, первая запись, которую я получаю, отображается с нулевым количеством, и эта строка не должна отображаться.xsl: для каждой группы с условием, производящим дополнительный вывод

Это XML, который не является полным комплектом, но я взял образец из исходного:

<?xml version='1.0' encoding='UTF-8'?> 
<Report_Data > 
    <Report_Entry> 
    <Participant_ID>033</Participant_ID> 
    <chk>673.58</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>Vana</Last_Name> 
     <First_Name>Sag</First_Name> 
     <Middle_Name>N</Middle_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>100.8</PreTaxAmt> 
    <MatchAmt>100.8</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>0</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>037</Participant_ID> 
    <chk>2167.89</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>Pilay</Last_Name> 
     <First_Name>Saath</First_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>61.81</PreTaxAmt> 
    <MatchAmt>61.81</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>0</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>043</Participant_ID> 
    <chk>819.78</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>ouphan</Last_Name> 
     <First_Name>angmala</First_Name> 
     <Gender_Code>2</Gender_Code> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>84.19</PreTaxAmt> 
    <MatchAmt>84.18</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>0</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>049</Participant_ID> 
    <chk>2066.54</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>Tizili</Last_Name> 
     <First_Name>ard</First_Name> 
     <Gender_Code>1</Gender_Code> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>136.37</PreTaxAmt> 
    <MatchAmt>136.36</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>0</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>094</Participant_ID> 
    <chk>946.71</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>holphakdy</Last_Name> 
     <First_Name>Meya</First_Name> 
     <Gender_Code>2</Gender_Code> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>81.25</PreTaxAmt> 
    <MatchAmt>81.25</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>0</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>104</Participant_ID> 
    <chk>1183.3</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>Sai</Last_Name> 
     <First_Name>Paupl</First_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>234.52</PreTaxAmt> 
    <MatchAmt>234.52</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>128.18</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>106</Participant_ID> 
    <chk>185.44</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>Leve</Last_Name> 
     <First_Name>Alen</First_Name> 
     <Middle_Name>S</Middle_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>61.48</PreTaxAmt> 
    <MatchAmt>61.47</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>0</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>106</Participant_ID> 
    <chk>0</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>Leve</Last_Name> 
     <First_Name>Alen</First_Name> 
     <Middle_Name>S</Middle_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>0</PreTaxAmt> 
    <MatchAmt>0</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>10</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>131</Participant_ID> 
    <chk>508.92</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>th</Last_Name> 
     <First_Name>Pa</First_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>0</PreTaxAmt> 
    <MatchAmt>0</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>0</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>153</Participant_ID> 
    <chk>277.2</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>Baer</Last_Name> 
     <First_Name>Er</First_Name> 
     <Middle_Name>D</Middle_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>72.39</PreTaxAmt> 
    <MatchAmt>72.38</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>0</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>155</Participant_ID> 
    <chk>1250.83</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>Piye</Last_Name> 
     <First_Name>Shirit</First_Name> 
     <Middle_Name>M</Middle_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>0</PreTaxAmt> 
    <MatchAmt>0</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>96.3</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>170</Participant_ID> 
    <chk>0</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>terner</Last_Name> 
     <First_Name>san</First_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>0</PreTaxAmt> 
    <MatchAmt>0</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>0</LoanAmt> 
</Report_Entry> 
<Report_Entry> 
    <Participant_ID>170</Participant_ID> 
    <chk>684.05</chk> 
    <Workers> 
     <FULL_PART_Time_Indicator>1</FULL_PART_Time_Indicator> 
     <Last_Name>terner</Last_Name> 
     <First_Name>san</First_Name> 
    </Workers> 
    <End_Date_from_Pay_Period>2016-01-03-08:00</End_Date_from_Pay_Period> 
    <PreTaxAmt>162.31</PreTaxAmt> 
    <MatchAmt>162.3</MatchAmt> 
    <RothAmt>0</RothAmt> 
    <LoanAmt>210.98</LoanAmt> 
    </Report_Entry> 

Я кладу мой XSLT, что я использовал:

<?xml version="1.0" encoding="UTF-8"?> 

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    version="2.0" xmlns:functx="http://www.functx.com" > 


    <xsl:variable name="linefeed" select="'&#xA;'"/> 
    <xsl:variable name="filler" select="'                                                                                                                             '"/> 
    <xsl:variable name="separator" select="','"/> 
    <xsl:variable name="spaces" 
    select="concat('   ','   ','   ','   ','   ','   ','   ','   ','   ')"/> 




    <xsl:template match="/"> 

    <xsl:call-template name="LoanDataRecord"/> 

    </xsl:template> 


    <xsl:template name="LoanDataRecord"> 

    <xsl:for-each-group select="Report_Data/Report_Entry" group-by="if( LoanAmt[. &gt; 0 ]) then Participant_ID else '' " >  
    <xsl:variable name="Var1" select="current-grouping-key()"/> 

    <!-- Plan Number --> 
    <xsl:value-of select="substring(concat('768002',$filler),1,6)"/> 
     <xsl:value-of select="$separator"/> 


    <!-- Participant Number --> 
    <xsl:value-of select="substring(concat(Participant_ID,$filler),1,9)"/> 
     <xsl:value-of select="$separator"/> 

    <!-- Loan Amt --> 
    <xsl:value-of select="(sum(current-group()/LoanAmt))"/> 
    <xsl:value-of select="$linefeed"/> 

    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 

768002,033709571,0

768002,104603206,128.18

и так далее

Но я не хочу видеть первую строку с 0 LoanAmt.

+1

Здесь вы можете разместить полный XSLT. –

+0

Мой xslt содержит конфиденциальные данные и имеет около 200 записей, поэтому я не смогу полностью его вставить. Это абсолютно необходимо для моего вопроса? Вы согласитесь взять это в автономном режиме? –

+0

Вам не нужно публиковать XSLT в реальном времени. Вы можете создать минимизированный входной XML и XSLT, который может представлять собой самую проблему здесь, и я думаю, это группировка. –

ответ

0

Проблема заключается в инструкции <xsl:for-each-group />. Измените его, чтобы использовать предикат:

<xsl:for-each-group select="Report_Data/Report_Entry[LoanAmt &gt; 0 ]" 
        group-by="Participant_ID"> 

Я тестировал его с помощью XML, и она работает: http://xsltransform.net/bnnZWu.

Кстати, я добавил <xsl:output method="text" />, так как этого вы, вероятно, захотите.

+0

Спасибо, это сработало! –

+0

Не могли бы вы объяснить мне, почему с моим кодом он не группировал только первую запись и даже не проверял кредит более чем на 0, а вместо этого попадал в цикл для печати значений. Но со следующей итерации он корректно проверял состояние и группировку. –

+1

Ваш код создавал дополнительную группу с 'grouping-key == ''', содержащую все записи, которые не соответствовали условию 'LoanAmt > 0' (из-за того, что у вас было предложение' else'). Поскольку все такие записи имели «LoanAmt == 0», общая сумма для этой группы также была равна 0. Но если вы измените некоторые записи на «LoanAmt» -1, -2, -3 и т. Д. Вы увидите, что первый запись приведет к получению такой суммы (значение, отличное от 0). – raulk

Смежные вопросы