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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Problem selecting distinct va, Pankaj Bishnoi | Thread | [xsl] Comparing sequences, cknell |
Re: [xsl] bad match expression, Terence Kearns | Date | [xsl] Remove node after testing for, Evans, Martin Chf Te |
Month |