RE: [xsl] Filter nodelist

Subject: RE: [xsl] Filter nodelist
From: "Adam van den Hoven" <list@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 27 Nov 2002 13:11:52 -0800
Ok so this is a few weeks over old. 

Assuming that a product node is current, I'd use:

count(preceding-sibling::product[@id=current()/@id])

That is, I took the following XML:
<products>
	<product id="A"/>
	<product id="B"/>
	<product id="C"/>
	<product id="B"/>
	<product id="B"/>
	<product id="D"/>
	<product id="E"/>
</products>

And applied the following transform (essentially the identity transform
with this calculation added to the product)
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
	<xsl:template match="node()|@*">
		<xsl:copy>
			<xsl:apply-templates select="*|@*"/>
		</xsl:copy>
	</xsl:template>

	<xsl:template match="product">
		<xsl:copy>
			<xsl:attribute name="previous_same_id_count">
				<xsl:value-of
select="count(preceding-sibling::product[@id=current()/@id])"/>
			</xsl:attribute>
			<xsl:apply-templates select="*|@*"/>
		</xsl:copy>
	</xsl:template>
</xsl:stylesheet>


And got the following result (running from within Stylus Studio)

<?xml version='1.0' ?>
<products>
  <product id="A" previous_same_id_count="0"/>
  <product id="B" previous_same_id_count="0"/>
  <product id="C" previous_same_id_count="0"/>
  <product id="B" previous_same_id_count="1"/>
  <product id="B" previous_same_id_count="2"/>
  <product id="D" previous_same_id_count="0"/>
  <product id="E" previous_same_id_count="0"/>
</products>

Which should be the thing you are looking for. 

Adam




> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Martin Kupisch
> Sent: November 7, 2002 3:11 AM
> To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Filter nodelist
> 
> 
> Hello everyone,
> 
> I have an XML document that contains a few 'product' elements 
> with 'id' attributes. Because I have to operate on these 
> products a few times I build a variable that just takes all 
> products with the expression 'descendant::product'. Sometimes 
> I have to iterate over all products. But that is not all I do 
> with the list. My problem: I have to get the count of all 
> products from this node-list that have the same id like a 
> certain product in the list  and that's position in the 
> node-list is lower. Example:
> 
> [product id="A",
>  product id="B",
>  product id="C",
>  product id="B",
>  product id="B",  <-
>  product id="D",
>  product id="E"]
> 
> So if I have the product at position 5 the result of the 
> count should be 2, because of the products at position 2 and 
> 4 with the same id.
> 
> Any ideas? Thanks.
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 
> 


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


Current Thread