使用XSL1.0对输出中的xml元素属性值进行排序并组合其他节点数据值

时间:2011-10-22 18:53:25

标签: xml xslt xslt-1.0

我已尝试过各种方法在下面显示的xml内容上编写xsl脚本。但是无法获得正确的格式化输出。我无法在XSL1.0中生成适当的systanxes。请问任何人帮助我。

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是第1列。 所以这将在D_Total之后占据第一位

Endpointname和SecondaryID属性未显示在输出中,因为它们没有任何值或可能被隐藏。

列:'IndividualName','Createdate','Userfield','checkamout'被分组 根据存款详情和会员详情。
因此,会员详细信息和存款详细信息将在相应的行中重复。

会员级别(即table1_Group1)的总计将是存款级别(即table1_Group2)的总和。存款级别总金额将是详细元素的总和(即<Detail>)。

我正在尝试上述结果的XSL1.0脚本如下:只有半部分我能够正确。我的主要挑战是获取 table1_Group1 元素值和 table1_Group2 元素值(即属性值)使用详细信息 元素属性...

     <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>&#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 个答案:

答案 0 :(得分:0)

如果您使用的是xslt 1.0,则需要使用分组。使用muenchian方法对xslt 1.0进行分组。

你可以在这里找到一个很好的例子:

Grouping with the muenchian method