[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] Finding nester distinct items


Subject: [xsl] Finding nester distinct items
From: "Craig Kattner" <CKattner@xxxxxxxxxxxxxx>
Date: Mon, 10 Mar 2003 13:26:48 -0600

I have the following XML:

<products>
<product id="439" model="FD12H">
	<desc>text</desc>
	<product_fact id="5" name="Finish">
		<val>Ivory Decorative</val>
	</product_fact>
	<product_fact id="8" name="Hold">
		<val>no</val>
	</product_fact>
	<product_fact id="6" name="Pole">
		<val>SPST</val>
	</product_fact>
	<product_fact id="7" name="Time">
		<val>12 hours</val>
	</product_fact>
</product>
<product id="439" model="FD6H">
	<desc>text</desc>
	<product_fact id="5" name="Finish">
		<val>Ivory Decorative</val>
	</product_fact>
	<product_fact id="8" name="Hold">
		<val>no</val>
	</product_fact>
	<product_fact id="6" name="Pole">
		<val>SPST</val>
	</product_fact>
	<product_fact id="7" name="Time">
		<val>6 hours</val>
	</product_fact>
</product>
<product id="439" model="FD4H">
	<desc>text</desc>
	<product_fact id="5" name="Finish">
		<val>Ivory Decorative</val>
	</product_fact>
	<product_fact id="8" name="Hold">
		<val>no</val>
	</product_fact>
	<product_fact id="6" name="Pole">
		<val>SPDT</val>
	</product_fact>
	<product_fact id="7" name="Time">
		<val>4 hours</val>
	</product_fact>
</product>
</products>

What I need is to get a distinct list of Pole val's and then for each Pole a distinct list of Time val's. (I need to be able to recreate this http://www.intermatic.com/comind/fdff.htm).

The best I've come up with is:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />

<xsl:template match="/">
	<xsl:apply-templates select="//product" />
</xsl:template>

<xsl:template match="product">
	<xsl:apply-templates select="product_fact[@name='Pole']" mode="pole_values">
		<xsl:sort select="@name" />
		<xsl:sort select="val" />
	</xsl:apply-templates>	
</xsl:template>

<!-- get the unique pole values -->
<xsl:template match="product_fact" mode="pole_values">
	<xsl:for-each select="../product_fact[not(val=following::product_fact/val) and @name='Pole']">
		<xsl:value-of select="val" /><br />
		<xsl:apply-templates select="." mode="time_values" />
	</xsl:for-each>
</xsl:template>

<!-- get the unique time values per pole -->
<xsl:template match="product_fact" mode="time_values">
	<xsl:for-each select="../ancestor::*/product/product_fact[not(val=following::product_fact/val) and @name='Time']">
		<xsl:value-of select="." /><br />
	</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

What I want is:
SPST
	12 Hours
	6 Hours
SPDT
	4 Hours

What I get is:
SPST
	12 Hours
	6 Hours
	4 Hours
SPDT
	12 Hours
	6 Hours
	4 Hours

Using MSXML 4 SP 1 for this if it makes a difference.

Thanks,
Craig


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



Current Thread