Re: [xsl] Problem selecting distinct values in XSLT1.0

Subject: Re: [xsl] Problem selecting distinct values in XSLT1.0
From: "Pankaj Bishnoi" <pankaj.bishnoi@xxxxxxxxxxx>
Date: Thu, 9 Feb 2006 12:54:50 +0530
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.bishnoi@xxxxxxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
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

Current Thread