xsl-list
[Top] [All Lists]

Re: Problem selecting distinct values in XSLT1.0

2006-02-09 00:24:50
Hi All
          This issue hasb been solved using keys. Here i have cretaed a key
that will be concating ProgramRID and ProgramPWID fields. In my case
ProgramPWID was having duplicate values and i needed to find distinct values
for every TPL_Program record.


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet extension-element-prefixes="redirect" version="1.1"
xmlns:java="http://xml.apache.org/xslt/java";
xmlns:oa="http://www.openapplications.org/oagis";
xmlns:pwpdp="http://www.powerway.com/pwpdp";
xmlns:redirect="org.apache.xalan.xslt.extensions.Redirect"
xmlns:str="http://exslt.org/strings";
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
    <xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0"/>
    <xsl:param name="_userName"/>
    <xsl:param name="_password"/>
    <xsl:param name="_class"/>
    <xsl:param name="_identifier"/>
    <xsl:param name="_subject"/>
    <xsl:param name="_repositoryPath"/>
    <xsl:param name="_Input1"/>
    <xsl:variable name="Input1" select="document($_Input1)"/>
    <xsl:variable name="apos">'</xsl:variable>
 <xsl:key name="ProcessKey" match="ProcessPWID"
use="concat(../ProgramRID,.)"/>

  <xsl:template match="/">

        <pwpdp:AddProgram>


                <xsl:for-each select="$Input1/DB/dbo.TPL_Program">
                    <pwpdp:Program>
                    <xsl:variable name="varProcessPPM"
select="dbo.TPL_Program_PPM"/>
                    <xsl:variable name="varProcessPWID"
select="dbo.TPL_Program_PPM/ProcessPWID"/>
                        <pwpdp:PwHeader>
                            <oa:DocumentId>
                                <oa:Id>
                                    <xsl:value-of select="RID"/>
                                </oa:Id>
                                <oa:Revision/>
                            </oa:DocumentId>
                        </pwpdp:PwHeader>
                        <xsl:if test="'' !=''">
                            <pwpdp:ProgramID>
                                <xsl:value-of select="''"/>
                            </pwpdp:ProgramID>
                        </xsl:if>
                        <pwpdp:ProgramName>
                            <xsl:value-of select="Name"/>
                        </pwpdp:ProgramName>
                        <xsl:if test="Description !=''">
                            <pwpdp:Description>
                                <xsl:value-of select="Description"/>
                            </pwpdp:Description>
                        </xsl:if>
                        <xsl:if test="ProgramStatus !=''">
                            <pwpdp:Status>
                                <xsl:value-of select="ProgramStatus"/>
                            </pwpdp:Status>
                        </xsl:if>
                        <pwpdp:PDO>
                            <pwpdp:PWID>
                                <xsl:value-of select="PDOPWID"/>
                            </pwpdp:PWID>
                            <pwpdp:TextName>
                                <xsl:value-of select="dbo.ST_PDO/Name"/>
                            </pwpdp:TextName>
                        </pwpdp:PDO>


      <xsl:for-each
select="$varProcessPWID[generate-id()=generate-id(key('ProcessKey',concat(..
/ProgramRID,.)))]">
               <pwpdp:Process>
                        <xsl:variable name="pwid" select="."/>

                  <xsl:if test=". != ''">
                                    <pwpdp:PWID>
                                        <xsl:value-of select="$pwid"/>
                                    </pwpdp:PWID>
                                </xsl:if>
                                <xsl:if test="'' != ''">
                                    <pwpdp:TextName>
                                        <xsl:value-of select="''"/>
                                    </pwpdp:TextName>
                                </xsl:if>
                                <xsl:for-each select="$varProcessPPM">
                                    <xsl:if test="GateNumber != '' and $pwid
= ProcessPWID">
                                        <pwpdp:PPM>
                                            <xsl:if test="'' != ''">
                                                <pwpdp:PWID>
                                                    <xsl:value-of
select="''"/>
                                                </pwpdp:PWID>
                                            </xsl:if>
                                            <xsl:if test="'' != ''">
                                                <pwpdp:TextName>
                                                    <xsl:value-of
select="''"/>
                                                </pwpdp:TextName>
                                            </xsl:if>
                                            <pwpdp:GateNumber>
                                                <xsl:value-of
select="GateNumber"/>
                                            </pwpdp:GateNumber>

                                        </pwpdp:PPM>
                                    </xsl:if>
                                </xsl:for-each>
                            </pwpdp:Process>
                        </xsl:for-each>

                    </pwpdp:Program>
                </xsl:for-each>

        </pwpdp:AddProgram>
    </xsl:template>
</xsl:stylesheet>



----- Original Message ----- 
From: "Pankaj Bishnoi" <pankaj(_dot_)bishnoi(_at_)adeptia(_dot_)com>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Sent: Wednesday, February 08, 2006 9:03 PM
Subject: [xsl] Problem selecting distinct values in XSLT1.0


Hi All
           I am having a scenario with XSLT1.0 where there are multiple
occurances of a field ProcessPWID. But this field will conatin only two
values say Pankaj and Bishnoi. These two values can be anything. My source
XML is::

<?xml version="1.0" encoding="UTF-8"?>
<DB>
    <dbo.TPL_Program Action="242" RollBackOnError="243">
        <RID>RID163</RID>
        <PWID>PWID164</PWID>
        <PDOPWID>PDOPWID165</PDOPWID>
        <CustomerKey>CustomerKey166</CustomerKey>
        <Name>Name167</Name>
        <Description>Description168</Description>
        <ProgramStatus>ProgramStatus169</ProgramStatus>
        <VerbType>VerbType170</VerbType>
        <Status>Status171</Status>
          <dbo.TPL_Program_PPM Action="207" RollBackOnError="208">
            <RID>RID195</RID>
            <ProgramRID>ProgramRID196</ProgramRID>
            <ProgramPWID>ProgramPWID197</ProgramPWID>
            <ProcessPWID>Pankaj</ProcessPWID>
            <PPMPWID>PPMPWID199</PPMPWID>
            <GateNumber>GateNumber100</GateNumber>
        </dbo.TPL_Program_PPM>
        <dbo.TPL_Program_PPM Action="221" RollBackOnError="222">
            <RID>RID209</RID>
            <ProgramRID>ProgramRID210</ProgramRID>
            <ProgramPWID>ProgramPWID211</ProgramPWID>
            <ProcessPWID>Bishnoi</ProcessPWID>
            <PPMPWID>PPMPWID213</PPMPWID>
            <GateNumber>GateNumber200</GateNumber>
        </dbo.TPL_Program_PPM>
       <dbo.TPL_Program_PPM Action="207" RollBackOnError="208">
            <RID>RID195</RID>
            <ProgramRID>ProgramRID204</ProgramRID>
            <ProgramPWID>ProgramPWID205</ProgramPWID>
            <ProcessPWID>Pankaj</ProcessPWID>
            <PPMPWID>PPMPWID199</PPMPWID>
            <GateNumber>GateNumber300</GateNumber>
        </dbo.TPL_Program_PPM>
        <dbo.TPL_Program_PPM Action="207" RollBackOnError="208">
            <RID>RID195</RID>
            <ProgramRID>ProgramRID304</ProgramRID>
            <ProgramPWID>ProgramPWID305</ProgramPWID>
            <ProcessPWID>Pankaj</ProcessPWID>
            <PPMPWID>PPMPWID199</PPMPWID>
            <GateNumber>GateNumber400</GateNumber>
        </dbo.TPL_Program_PPM>
    </dbo.TPL_Program>
    <dbo.TPL_Program Action="323" RollBackOnError="324">
        <RID>RID244</RID>
        <PWID>PWID245</PWID>
        <PDOPWID>PDOPWID246</PDOPWID>
        <CustomerKey>CustomerKey247</CustomerKey>
        <Name>Name248</Name>
        <Description>Description249</Description>
        <ProgramStatus>ProgramStatus250</ProgramStatus>
        <VerbType>VerbType251</VerbType>
        <Status>Status252</Status>
       <dbo.TPL_Program_PPM Action="207" RollBackOnError="208">
            <RID>RID195</RID>
            <ProgramRID>ProgramRID196</ProgramRID>
            <ProgramPWID>ProgramPWID197</ProgramPWID>
            <ProcessPWID>Pankaj</ProcessPWID>
            <PPMPWID>PPMPWID199</PPMPWID>
            <GateNumber>GateNumber300</GateNumber>
        </dbo.TPL_Program_PPM>
        <dbo.TPL_Program_PPM Action="221" RollBackOnError="222">
            <RID>RID209</RID>
            <ProgramRID>ProgramRID210</ProgramRID>
            <ProgramPWID>ProgramPWID211</ProgramPWID>
            <ProcessPWID>Bishnoi</ProcessPWID>
            <PPMPWID>PPMPWID213</PPMPWID>
            <GateNumber>GateNumber200</GateNumber>
        </dbo.TPL_Program_PPM>
       <dbo.TPL_Program_PPM Action="207" RollBackOnError="208">
            <RID>RID195</RID>
            <ProgramRID>ProgramRID204</ProgramRID>
            <ProgramPWID>ProgramPWID205</ProgramPWID>
            <ProcessPWID>Pankaj</ProcessPWID>
            <PPMPWID>PPMPWID199</PPMPWID>
            <GateNumber>GateNumber200</GateNumber>
        </dbo.TPL_Program_PPM>
        <dbo.TPL_Program_PPM Action="207" RollBackOnError="208">
            <RID>RID195</RID>
            <ProgramRID>ProgramRID304</ProgramRID>
            <ProgramPWID>ProgramPWID305</ProgramPWID>
            <ProcessPWID>Pankaj</ProcessPWID>
            <PPMPWID>PPMPWID199</PPMPWID>
            <GateNumber>GateNumber300</GateNumber>
        </dbo.TPL_Program_PPM>
    </dbo.TPL_Program>
</DB>




and my xsl is :::::::::::::::

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet extension-element-prefixes="redirect" version="1.1"
xmlns:java="http://xml.apache.org/xslt/java";
xmlns:oa="http://www.openapplications.org/oagis";
xmlns:pwpdp="http://www.powerway.com/pwpdp";
xmlns:redirect="org.apache.xalan.xslt.extensions.Redirect"
xmlns:str="http://exslt.org/strings";
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
    <xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0"/>
    <xsl:param name="_userName"/>
    <xsl:param name="_password"/>
    <xsl:param name="_class"/>
    <xsl:param name="_identifier"/>
    <xsl:param name="_subject"/>
    <xsl:param name="_repositoryPath"/>
   <xsl:template match="/">
        <pwpdp:AddProgram>
                <xsl:for-each select="/DB/dbo.TPL_Program">
                    <pwpdp:Program>
                    <xsl:variable name="varProcessPPM"
select="dbo.TPL_Program_PPM"/>
                    <xsl:variable name="varProcessPWID"
select="dbo.TPL_Program_PPM/ProcessPWID"/>
                        <pwpdp:PwHeader>
                            <oa:DocumentId>
                                <oa:Id>
                                    <xsl:value-of select="RID"/>
                                </oa:Id>
                                <oa:Revision/>
                            </oa:DocumentId>
                        </pwpdp:PwHeader>
                        <xsl:if test="'' !=''">
                            <pwpdp:ProgramID>
                                <xsl:value-of select="''"/>
                            </pwpdp:ProgramID>
                        </xsl:if>
                        <pwpdp:ProgramName>
                            <xsl:value-of select="Name"/>
                        </pwpdp:ProgramName>
                        <xsl:if test="Description !=''">
                            <pwpdp:Description>
                                <xsl:value-of select="Description"/>
                            </pwpdp:Description>
                        </xsl:if>
                        <xsl:if test="ProgramStatus !=''">
                            <pwpdp:Status>
                                <xsl:value-of select="ProgramStatus"/>
                            </pwpdp:Status>
                        </xsl:if>
                        <pwpdp:PDO>
                            <pwpdp:PWID>
                                <xsl:value-of select="PDOPWID"/>
                            </pwpdp:PWID>
                            <pwpdp:TextName>
                                <xsl:value-of select="dbo.ST_PDO/Name"/>
                            </pwpdp:TextName>
                        </pwpdp:PDO>
                        <xsl:for-each
select="$varProcessPWID[not(.=preceding::ProcessPWID)]">
                        <pwpdp:Process>
        <xsl:variable name="pwid" select="."/>
        <xsl:if test=". != ''">
                                    <pwpdp:PWID>
                                        <xsl:value-of select="$pwid"/>
                                    </pwpdp:PWID>
                                </xsl:if>
                                <xsl:if test="'' != ''">
                                    <pwpdp:TextName>
                                        <xsl:value-of select="''"/>
                                    </pwpdp:TextName>
                                </xsl:if>
                                <xsl:for-each select="$varProcessPPM">
                                    <xsl:if test="GateNumber != '' and
$pwid
= ProcessPWID">
                                        <pwpdp:PPM>
                                            <xsl:if test="'' != ''">
                                                <pwpdp:PWID>
                                                    <xsl:value-of
select="''"/>
                                                </pwpdp:PWID>
                                            </xsl:if>
                                            <xsl:if test="'' != ''">
                                                <pwpdp:TextName>
                                                    <xsl:value-of
select="''"/>
                                                </pwpdp:TextName>
                                            </xsl:if>
                                            <pwpdp:GateNumber>
                                                <xsl:value-of
select="GateNumber"/>
                                            </pwpdp:GateNumber>
                                        </pwpdp:PPM>
                                    </xsl:if>
                                </xsl:for-each>
                            </pwpdp:Process>
                        </xsl:for-each>
                    </pwpdp:Program>
                </xsl:for-each>
                </pwpdp:AddProgram>
    </xsl:template>
</xsl:stylesheet>




here i use Preceeding for selecting distinct values but this creates
problems for second record as it applies for complete src xml file. The
output generated is:::::::::::



<?xml version="1.0" encoding="UTF-8"?>
<pwpdp:AddProgram xmlns:java="http://xml.apache.org/xslt/java";
xmlns:oa="http://www.openapplications.org/oagis";
xmlns:pwpdp="http://www.powerway.com/pwpdp";
xmlns:str="http://exslt.org/strings";>
    <pwpdp:Program>
        <pwpdp:PwHeader>
            <oa:DocumentId>
                <oa:Id>RID163</oa:Id>
                <oa:Revision/>
            </oa:DocumentId>
        </pwpdp:PwHeader>
        <pwpdp:ProgramName>Name167</pwpdp:ProgramName>
        <pwpdp:Description>Description168</pwpdp:Description>
        <pwpdp:Status>ProgramStatus169</pwpdp:Status>
        <pwpdp:PDO>
            <pwpdp:PWID>PDOPWID165</pwpdp:PWID>
            <pwpdp:TextName/>
        </pwpdp:PDO>
        <pwpdp:Process>
            <pwpdp:PWID>Pankaj</pwpdp:PWID>
            <pwpdp:PPM>
                <pwpdp:GateNumber>GateNumber100</pwpdp:GateNumber>
            </pwpdp:PPM>
            <pwpdp:PPM>
                <pwpdp:GateNumber>GateNumber300</pwpdp:GateNumber>
            </pwpdp:PPM>
            <pwpdp:PPM>
                <pwpdp:GateNumber>GateNumber400</pwpdp:GateNumber>
            </pwpdp:PPM>
        </pwpdp:Process>
        <pwpdp:Process>
            <pwpdp:PWID>Bishnoi</pwpdp:PWID>
            <pwpdp:PPM>
                <pwpdp:GateNumber>GateNumber200</pwpdp:GateNumber>
            </pwpdp:PPM>
        </pwpdp:Process>
    </pwpdp:Program>
    <pwpdp:Program>
        <pwpdp:PwHeader>
            <oa:DocumentId>
                <oa:Id>RID244</oa:Id>
                <oa:Revision/>
            </oa:DocumentId>
        </pwpdp:PwHeader>
        <pwpdp:ProgramName>Name248</pwpdp:ProgramName>
        <pwpdp:Description>Description249</pwpdp:Description>
        <pwpdp:Status>ProgramStatus250</pwpdp:Status>
        <pwpdp:PDO>
            <pwpdp:PWID>PDOPWID246</pwpdp:PWID>
            <pwpdp:TextName/>
        </pwpdp:PDO>
    </pwpdp:Program>
</pwpdp:AddProgram>




here in second Program record i have no process element because of
<xsl:for-each select="$varProcessPWID[not(.=preceding::ProcessPWID)]">
 is there any other way??

I cannot use XSLT2.0





Thanks
Pankaj


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>