Subject: [xsl] Problem selecting distinct values in XSLT1.0 From: "Pankaj Bishnoi" <pankaj.bishnoi@xxxxxxxxxxx> Date: Wed, 8 Feb 2006 21:03:11 +0530 |
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] Decoding images saved as word, Jesper Tverskov | Thread | Re: [xsl] Problem selecting distinc, Pankaj Bishnoi |
Re: [xsl] Online Help for XSLT func, Florent Georges | Date | Re: [xsl] Online Help for XSLT func, Jon Gorman |
Month |