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

Re: [xsl] Keeping track of processed nodes, to avoid redundant output.


Subject: Re: [xsl] Keeping track of processed nodes, to avoid redundant output.
From: George Cristian Bina <george@xxxxxxxxxxxxx>
Date: Tue, 11 Sep 2007 13:48:35 +0300

Hi John,

You can define a key that matches enElement and use the name attribute. Then you can process only the first element that matches a given value:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="name" match="anElement" use="@name"/>
<xsl:template match="/">
<out><xsl:apply-templates/></out>
</xsl:template>
<xsl:template match="anElement">
<xsl:if test="generate-id(.)=generate-id(key('name', @name)[1])">
<name><xsl:value-of select="@name"/></name>
</xsl:if>
</xsl:template>
</xsl:stylesheet>



Regards, George --------------------------------------------------------------------- George Cristian Bina - http://aboutxml.blogspot.com/ <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com


John Smith wrote:
Hello,

This is a simplified description of what I am trying to do, I have an
xml document like this:

<main>
  <someElement>
    <anElement name="John" />
  </someElement>
  <someElement>
    <anElement name="Jane" />
  </someElement>
  <someElement>
    <anElement name="John" />
  </someElement>
  <someElement>
    <anElement name="Jane" />
  </someElement>
</main>


and I like to retrieve each 'name' attribute from 'anElement', but I only want to process the name once. So if the 'John' attribute is repeated I want to somehow keep track that I have already processed it, hence there is no need to process it again.

So for the given example I like to output something like:

<out>
  <name>John</name>
  <name>Jane</name>
</out>


Thanks, John


Current Thread