Я пробовал разные способы написания 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 является 1-м столбцом.
И вот это займет первое место после D_Total
Атрибуты Endpointname и SecondaryID не отображаются в выходных данных, поскольку они не имеют никаких значений или могут быть скрыты.
Сгруппированы столбцы: «IndividualName», «Createdate», «Userfield», «checkamout»
под Депозитные реквизиты и реквизиты.
Таким образом, данные участника и данные депозита будут повторяться в соответствующих строках.
Итоговые данные для уровня участника (т.е. table1_Group1) будут суммой уровня депозита (т.е. table1_Group2). Общая сумма уровня депозита будет суммой элементов детализации (т.е. <Detail>
).
Сценарий XSL1.0, который я пытаюсь получить для приведенного выше результата, выглядит следующим образом: Правильно получить только половину. Моя главная задача здесь состоит в том, чтобы получить значения table1_Group1 element и значения table1_Group2 element (т.е. значения атрибутов) вместе с Деталь элемент атрибуты ...
<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> </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>