|
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 |