#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 выполняется методом мюншиана.
хороший пример можно найти здесь: