Сортировка значений атрибутов xml-элемента и объединение значений данных других узлов в выходных данных с использованием XSL1.0

#xml #xslt #xslt-1.0

#xml #xslt #xslt-1.0

Вопрос:

Я пробовал различные способы написания xsl-скрипта для приведенного ниже XML-содержимого. Но не удается получить правильно отформатированный вывод. Я не могу создать правильные системные блоки в XSL1.0. Может ли кто-нибудь мне помочь, пожалуйста.

XML-файл выглядит следующим образом:

 <?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" ?>
<Report xmlns="getItemDetails">
    <table1 v_Head1="Capture Date" Head1_Order="2" v_Head2="End Point Name" Head2_Order="" v_Head3="Secondary ID" Head3_Order="" v_Head4="Individual Name" Head4_Order="1" v_Head5="User Field1"  Head5_Order="3" v_Head6="Check Amount"  Head6_Order="4">
        <table1_Group1_Collection>
            <table1_Group1 MemberName="Memb1" MemberID="61172" MemberTotalAmount="240.00">
                <table1_Group2_Collection>
                    <table1_Group2 DepositNumber="001" DepositID="567328" DepositTotal="135.00">
                        <Detail_Collection>
                            <Detail v_createdate="03/08/2011" createdate_Order="2" v_EndpointName="null" EndpointName_Order="" v_SecondaryID="" SecondaryID_Order="" v_IndividualName="aaa" IndividualName_Order="1" v_UserField1="abcabc" UserField1_Order="3" v_checkamount="50.00" checkamount_Order="4"/>
                            <Detail v_createdate="03/08/2011" createdate_Order="2" v_EndpointName="null" EndpointName_Order="" v_SecondaryID="" SecondaryID_Order="" v_IndividualName="bbb" IndividualName_Order="1" v_UserField1="acab" UserField1_Order="3" v_checkamount="25.00" checkamount_Order="4"/>
                            <Detail v_createdate="03/09/2011" createdate_Order="2" v_EndpointName="null" EndpointName_Order="" v_SecondaryID="" SecondaryID_Order="" v_IndividualName="ccc" IndividualName_Order="1" v_UserField1="cdfg" UserField1_Order="3" v_checkamount="60.00" checkamount_Order="4"/>
                        </Detail_Collection>
                    </table1_Group2>
                    <table1_Group2 DepositNumber="002 " DepositID="567329" DepositTotal="105.00">
                        <Detail_Collection>
                            <Detail v_createdate="03/09/2011" createdate_Order="2" v_EndpointName="null" EndpointName_Order="" v_SecondaryID="" SecondaryID_Order="" v_IndividualName="ddd" IndividualName_Order="1" v_UserField1="efgh" UserField1_Order="3" v_checkamount="35.00" checkamount_Order="4"/>
                            <Detail v_createdate="03/10/2011" createdate_Order="2" v_EndpointName="null" EndpointName_Order="" v_SecondaryID="" SecondaryID_Order="" v_IndividualName="eee" IndividualName_Order="1" v_UserField1="hijk" UserField1_Order="3" v_checkamount="70.00" checkamount_Order="4"/>
                        </Detail_Collection>
                    </table1_Group2>
                </table1_Group2_Collection>
            </table1_Group1>
            <table1_Group1 MemberName="Memb2" MemberID="61173" MemberTotalAmount="275.00">
                <table1_Group2_Collection>
                    <table1_Group2 DepositNumber="003" DepositID="567330" DepositTotal="75.00">
                        <Detail_Collection>
                            <Detail v_createdate="03/11/2011" createdate_Order="2" v_EndpointName="null" EndpointName_Order="" v_SecondaryID="" SecondaryID_Order="" v_IndividualName="fff" IndividualName_Order="1" v_UserField1="lmn" UserField1_Order="3" v_checkamount="75.00" checkamount_Order="4"/>
                        </Detail_Collection>
                    </table1_Group2>
                    <table1_Group2 DepositNumber="004 " DepositID="567331" DepositTotal="200.00">
                        <Detail_Collection>
                            <Detail v_createdate="03/11/2011" createdate_Order="2" v_EndpointName="null" EndpointName_Order="" v_SecondaryID="" SecondaryID_Order="" v_IndividualName="ggg" IndividualName_Order="1" v_UserField1="opq" UserField1_Order="3" v_checkamount="150.00" checkamount_Order="4"/>
                            <Detail v_createdate="03/12/2011" createdate_Order="2" v_EndpointName="null" EndpointName_Order="" v_SecondaryID="" SecondaryID_Order="" v_IndividualName="hhh" IndividualName_Order="1" v_UserField1="rstu" UserField1_Order="3" v_checkamount="50.00" checkamount_Order="4"/>
                        </Detail_Collection>
                    </table1_Group2>
                </table1_Group2_Collection>
            </table1_Group1>
        </table1_Group1_Collection>
    </table1>
</Report>
  

Из приведенного выше XML-файла мне нужно получить следующий вывод.

 MemberName, MemberID, MemberTotal, D_Number, D_ID, D_Total, IndividualName, Createdate, UserField1, Checkamount
Memb1, 61172, $240.00, 001, 567328, $135.00, aaa, 03/08/2011, abcabc, $50.00
Memb1, 61172, $240.00, 001, 567328, $135.00, bbb, 03/08/2011, acab, $25.00
Memb1, 61172, $240.00, 001, 567328, $135.00, ccc, 03/09/2011, cdfg, $60.00
Memb1, 61172, $240.00, 002, 567329, $105.00, ddd, 03/09/2011, efgh, $35.00
Memb1, 61172, $240.00, 002, 567329, $105.00, eee, 03/10/2011, hijk, $70.00
Memb2, 61173, $275.00, 003, 567330,  $75.00, fff, 03/09/2011, lmn,  $75.00
Memb2, 61173, $275.00, 004, 567331, $200.00, ggg, 03/09/2011, opq, $150.00
Memb2, 61173, $275.00, 004, 567331, $200.00, hhh, 03/10/2011, rstu, $50.00
  

Вплоть до D_Total имена столбцов фиксированы.
Имена столбцов после ‘D_Total’ приведены в порядке сортировки (вы можете видеть в xml-файле ключевое слово ‘order’ в качестве суффикса к каждому атрибуту).
В этом сценарии IndividualName является первым столбцом.
И поэтому это займет первое место после D_Total

Атрибуты Endpointname и SecondaryID не отображаются в выходных данных, поскольку они не имеют никаких значений или могут быть скрыты.

Столбцы: ‘IndividualName’, ‘Createdate’, ‘Userfield’, ‘checkamout’ сгруппированы в разделах Сведения о депозите и сведения об участнике.
Таким образом, данные участника и сведения о депозите будут повторяться в соответствующих строках.

Итоговые значения для уровня участника (т.Е. table1_Group1) будут суммой уровня депозита (т.Е. table1_Group2). Общий объем депозита будет равен сумме элементов detail (т.е. <Detail> ).

Скрипт XSL1.0, который я пытаюсь использовать для получения вышеуказанного результата, выглядит следующим образом: это только половина части, которую я могу исправить. Моя основная задача здесь — получить значения table1_Group1 и значения table1_Group2 (т. е. значения атрибутов) вместе с атрибутами элемента Detail

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:c="getItemDetails">
    <xsl:output method="text"/>
        <xsl:strip-space elements="*"/>

                  <xsl:template match="c:Report">
            <xsl:apply-templates select="c:table1"/>
            <xsl:apply-templates select="//c:Detail"/>
      </xsl:template>


      <xsl:template match="c:table1">
              <xsl:apply-templates select="@*[substring(name(), string-length(name())-5)= '_Order' and number(.) = number(.)]      ">
                  <xsl:sort data-type="number"/>
            </xsl:apply-templates>
      </xsl:template>


         <xsl:template match="c:Detail">
              <xsl:text>amp;#10;</xsl:text>
              <xsl:apply-templates select="@*[substring(name(), string-length(name())-5)= '_Order' and number(.) = number(.)]      ">
                  <xsl:sort data-type="number"/>
              </xsl:apply-templates>
        </xsl:template>


    <xsl:template match="@*">
        <xsl:value-of select="../@*[name()=concat('v_',substring-before(substring(name(current()),1),'_'))]"/>
        <xsl:if test="not(position()=-1)">,</xsl:if> 
    </xsl:template>


</xsl:stylesheet>
  

Комментарии:

1. Если у вас есть контроль над xml, я бы изменил xml на column1_Name=»IndividualName» IndividualName = «ggg» column2_Name=»v_createdDate» v_createdDate=»11.03.2011″

2. Не могли бы вы опубликовать некоторые попытки в xslt? Или мы должны написать полное решение для вас?

3. Итак, с какими битами у вас возникли проблемы — где вы застряли?

4. Я могу получить значения в выходных данных для элементов details … как только я там @ <узел details elements, я не могу получить значения родительских узлов (я имею в виду значения элементов группировки и значения депозита)

5. Пожалуйста, кто-нибудь может проверить мой скрипт xslt, чтобы получить соответствующий результат, чтобы получить правильный результат.

Ответ №1:

если вы используете xslt 1.0, вам нужно будет использовать группировку. Группировка в xslt 1.0 выполняется методом мюншиана.

хороший пример можно найти здесь:

Группировка методом мюншиана