इनपुट

<root>
<TL>
    <msg>
        <output_getquerydata>
            <queries>
                <query name="q1">
                    <parameters>
                        <parameter name="id">906OREA</parameter>
                    </parameters>
                    <queryErrors/>
                    <queryResults>
                        <record>
                            <column name="actionState">sdss</column>
                        </record>
                    </queryResults>
                </query>
                <query name="q2">
                    <parameters>
                        <parameter name="resCode">CTL-3819</parameter>
                        <parameter name="prodCode">89CMID</parameter>
                    </parameters>
                    <queryErrors/>
                    <queryResults>
                        <record id="1">
                            <column name="resource_externalId">CTL-000002</column>
                            <column name="compartmentCode">CTL-3819-01</column>
                            <column name="ExternalProductId"/>
                        </record>
                        <record id="2">
                            <column name="resource_externalId">CTL-000002</column>
                            <column name="compartmentCode">CTL-3819-02</column>
                            <column name="ExternalProductId"/>
                        </record>
                        <record id="3">
                            <column name="resource_externalId"/>
                            <column name="compartmentCode"/>
                            <column name="position"/>
                            <column name="ExternalProductId">316442</column>
                        </record>
                    </queryResults>
                </query>
                <query name="q2">
                    <parameters>
                        <parameter name="resCode">CTL-3819</parameter>
                        <parameter name="prodCode">91VPRM</parameter>
                    </parameters>
                    <queryErrors/>
                    <queryResults>
                        <record id="1">
                            <column name="resource_externalId">CTL-000002</column>
                            <column name="compartmentCode">CTL-3819-01</column>
                            <column name="position">1</column>
                            <column name="ExternalProductId"/>
                        </record>
                        <record id="2">
                            <column name="resource_externalId"/>
                            <column name="compartmentCode"/>
                            <column name="position"/>
                            <column name="ExternalProductId">316495</column>
                        </record>
                    </queryResults>
                </query>
            </queries>
        </output_getquerydata>
    </msg>
    <TL>
        <id>65004</id>
        <ArticleNr>89CMID</ArticleNr>
        <Gross>2700</Gross>
    </TL>
    <TL>
        <id>65005</id>
        <ArticleNr>89CMID</ArticleNr>
        <Gross>1700</Gross>
        <BOLNumber>18117</BOLNumber>
    </TL>
    <TL>
        <id>65006</id>
        <ArticleNr>89CMID</ArticleNr>
        <Gross>2100</Gross>
        <BOLNumber>18117</BOLNumber>
    </TL>
    <TL>
        <id>65007</id>
        <ArticleNr>91VPRM</ArticleNr>
        <Gross>500</Gross>
        <BOLNumber>18117</BOLNumber>
    </TL>
</TL>
</root>

एक्सएसएल:

   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output encoding="ISO-8859-1" indent="yes" method="xml"/>
<xsl:key name="Article" match="TL" use="./ArticleNr"/>
<xsl:key name="prod" match="query[@name='q2']/queryResults/record" use="../../parameters/parameter[@name='prodCode']"/>
<xsl:template match="root">
    <msglist>
        <xsl:for-each select="./TL[./msg/output_getquerydata/queries/query/queryResults/record/column[@name='actionState'] !='finished'] ">
            <xsl:variable name="distinctArticle" select="//TL[string(ArticleNr)][count(. | key('Article',ArticleNr)[1]) = 1]"/>
            <msg>
                <CMT>
                    <m>
                        <a>
                            <AP>
                                <xsl:variable name="position">
                                    <!--variable to concatenate all products -->
                                    <xsl:for-each select="$distinctArticle">
                                        <xsl:variable name="pos" select="concat(key('prod', .//ArticleNr)/column[@name='ExternalProductId'][. != ''],';')"/>
                                        <xsl:value-of select="$pos"/>
                                    </xsl:for-each>
                                </xsl:variable>
                                <xsl:for-each select="TL[generate-id() = 
                   generate-id(key('Article', .//ArticleNr)[1])]">
                                    <grossVolume>
                                        <xsl:value-of select="sum(concat(.,';'))"/>
                                    </grossVolume>
                                </xsl:for-each>
                                <product>
                                    <xsl:choose>
                                        <xsl:when test="substring($position, string-length($position))=';'">
                                            <xsl:value-of select="substring($position, 1, string-length($position)-1)"/>
                                        </xsl:when>
                                        <xsl:otherwise>
                                            <xsl:value-of select="$position"/>
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </product>
                            </AP>
                        </a>
                    </m>
                </CMT>
            </msg>
        </xsl:for-each>
    </msglist>
</xsl:template>
</xsl:stylesheet>

आउटपुट लगभग अच्छा है। बात यह है कि मुझे एक ही ArticleNr के लिए सभी "सकल" नोड्स का योग रखने के लिए ग्रॉसवॉल्यूम नोड में आवश्यकता है। तो, मेरा आउटपुट होगा:

 <grossVolume>6500;500</grossVolume>
 <product>316442;316495</product>

क्योंकि ArticleNr - 89CMID - के लिए, हमारे पास सकल 2700+1700+2100=6500 में योग मान हैं।

मूल रूप से, सभी "ArticleNr" नोड्स के लिए जिनके समान मान हैं, मुझे सभी संख्याओं को उनके संबंधित "सकल" नोड्स से जोड़ना होगा, और फिर एक आउटपुट उत्पन्न करना होगा जहां हम इन रकम को जोड़ते हैं। उत्पाद नोड आउटपुट के लिए, मैं आवश्यक मानों को जोड़ता हूं, और यह काम करता है, मुझे ग्रॉसवॉल्यूम नोड में भी इसी तरह की जानकारी की आवश्यकता है।

शुक्रिया!

1
user3529643 11 जून 2018, 14:25

1 उत्तर

सबसे बढ़िया उत्तर

आप एक ही निर्देश में sum() और concat() नहीं कर सकते क्योंकि यह स्ट्रिंग और संख्या संयोजन के लिए एक त्रुटि देगा। योग को स्थानीय चर में संग्रहित करना होगा और फिर <grossVolume> का मान बनाने के लिए अन्य योगों के साथ संयोजन करना होगा।

कृपया TL के लिए for-each लूप बदलें

<xsl:for-each select="TL[generate-id() = generate-id(key('Article', .//ArticleNr)[1])]">
    <grossVolume>
        <xsl:value-of select="sum(concat(.,';'))"/>
    </grossVolume>
</xsl:for-each>

नीचे दिए गए स्निपेट के लिए

<grossVolume>
    <xsl:for-each select="TL[generate-id() = generate-id(key('Article', ./ArticleNr)[1])]">
        <xsl:variable name="sumGross" select="sum(key('Article', ./ArticleNr)/Gross)" />
        <xsl:value-of select="$sumGross" />
        <xsl:if test="position() != last()">
            <xsl:value-of select="';'" />
        </xsl:if>
    </xsl:for-each>
</grossVolume>

उत्पादन

<grossVolume>6500;500</grossVolume>
1
Aniket V 11 जून 2018, 14:56