Subject: RE: Grouping using the set:Distinct template from EXSLT
From: "Vandna Sharma" <sharmav@xxxxxxxxxxxxx>
Date: Tue, 17 Apr 2007 11:51:00 -0400
|
> Hi all I am very new to XSLT programming,
> I am trying to do, "Grouping using the set:Distinct template from EXSLT". I
am having problem when I try to debug the xml file, I am getting error message
undefined template. I am using XMLspy version 5 rel.4. Below is the xml file,
and xsl.
>
XSL file
> <?xml version="1.0" encoding="utf-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:set="http://exslt.org/set" version="1.0"
extension-element-prefixes="set" set:doc="http://www.exslt.org/set">
> <xsl:output encoding="utf-8" method="html" />
> <xsl:include href="style1.xsl"/>
>
> <!-- The essence of using the variable instead is very similar to a key
table. In
> this solution, all products are put into the variable (which itself is in
document order):-->
> <xsl:variable name="AllProducts" select="/"/>
>
> <!-- The variable $AllRegions will be initialized with all of the distinct
> region elements. This collection of nodes is created using the
> set:distinct extension function from EXSLT.org (see bottom) -->
> <xsl:variable name="AllRegionsDistinct">
> <xsl:call-template name="set:distinct">
> <xsl:with-param name="nodes" select="//products/product/region"
/>
> </xsl:call-template>
> </xsl:variable>
> <xsl:variable name="AllRegions" select="$AllRegionsDistinct"/>
>
>
> <!-- Template for root rule -->
> <xsl:template match="/">
> <xsl:call-template name="Style1"/>
> <h2>Grouping of Products by Region, then by Product Name </h2>
> <xsl:apply-templates />
> </xsl:template>
>
> <!-- Template for products rule -->
> <xsl:template match="products">
>
> <!-- Iterate through the variable containing all of the unique regions
-->
> <xsl:for-each select="$AllRegions/region">
> <xsl:variable name="region" select="." /><BR></BR>
>
> <H3>Region: <xsl:value-of select="$region" /></H3>
>
> <table border="1">
> <tr>
> <th>Product ID</th>
> <th>Name</th>
> <th>Price</th>
> <th>Quantity</th>
> <th>Region</th>
> </tr>
>
> <!-- Grab the product elements that match the current retion. At this
point
> the products are retrived from our variable rather than the document
itself-->
> <xsl:for-each select="$AllProducts/products/product[region=$region]">
> <xsl:sort select="name"/>
> <tr>
> <td><xsl:value-of select="prodid" /></td>
> <td><xsl:value-of select="name" /></td>
> <td><xsl:value-of select="price" /></td>
> <td><xsl:value-of select="quantity" /></td>
> <td><xsl:value-of select="region" /></td>
>
> </tr>
> </xsl:for-each>
> </table>
> </xsl:for-each>
> </xsl:template>
>
> <xsl:template name="set:distinct">
> <xsl:param name="nodes" select="/.." />
>
> <xsl:choose>
> <xsl:when test="not($nodes)" />
>
> <xsl:otherwise>
> <xsl:copy-of select="$nodes[1][not(. = $nodes[position()
> 1])]" />
>
> <xsl:call-template name="set:distinct">
> <xsl:with-param name="nodes" select="$nodes[position()
> 1]" />
> </xsl:call-template>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:template>
> </xsl:stylesheet>
>
>
>
>
>
> XML file
>
>
> <?xml version="1.0" encoding="utf-8"?>
> <products>
> <product>
> <prodid>V123049</prodid>
> <name>Screen-Top Monitor Shelf</name>
> <price>$59</price>
> <quantity>30</quantity>
> <region>NorthWest</region>
> </product>
> <product>
> <prodid>V392039</prodid>
> <name>Womens Bracelet Watch</name>
> <price>$175</price>
> <quantity>335</quantity>
> <region>SouthWest</region>
> </product>
> <product>
> <prodid>L930389</prodid>
> <name>Tobshiba Portable DVD Player</name>
> <price>$1,299</price>
> <quantity> >30</quantity>
> <region>NorthWest</region>
> </product>
> </products>
>
>
>
>
>
> Thanks
> Vandna
|