RE: [xsl] How do can I select distinct nodes and adding a counter at the sa me time

Subject: RE: [xsl] How do can I select distinct nodes and adding a counter at the sa me time
From: TSchutzerWeissmann@xxxxxxxxxxxxxxxx
Date: Fri, 22 Nov 2002 15:58:46 -0000
Dear Ismaël

>I know what you mean, but the problem I have is how do I produce a tree
with
>distinct values that I can access afterwards.

This is essentially a grouping problem. You can use xsl:key to group
elements according to a particular value. This will allow you to access the
distinct values as a nodeset, without having to put them in a variable and
use an extension function.

[from your first email]

> The second one looks like this:
> 
> 	<xx>
> 		<xxx>.1.5.6.3.8
> 		   <xxxx att1=".1.5.6.3.8"/>
> 		<xxx>
> 		<xxx>.1.5.6.3.10
> 		   <xxxx att2="1.5.6.3.9"/>
> 		<xxx>
> 		<xxx>.1.5.6.4.5</xxx>
> 	</xx>
[...]
>  What I want to do know is getting out of the second xml file the
> values of the attributes mapped onto an odd number (5,7,9) when this
> attribute is available. When not available the text value of the tag must
be
> used. 

The only hard bit is setting up the key so that it ignores the text value of
the xxx tag if there's an xxxx child with an attribute.

<xsl:key name="distinctlyXXX" match="xxx" 
  use="self::xxx[not(xxxx/@*)]|xxxx/@*"/>

<!-- group on the xxxx child's first attribute, if it exists, 
     otherwise on the text value of xxx -->

<xsl:variable name="first_path" select="firstFile.xml"/>
<xsl:variable name="first" select="document($first_path)"/>
<xsl:variable name="first_count_maps" select="count($first/mapping/map)"/>

  <xsl:template match="xx">
    <mapping>
      <xsl:copy-of select="$first/mapping/map"/>
      <xsl:apply-templates
        select="xxx[generate-id() = generate-id(key('distinctlyXXX', 
                self::xxx[not(xxxx/@*)]|xxxx/@*))]"/>
      <!-- this is classic Muenchian grouping -->
    </mapping>
</xsl:template>

  <xsl:template match="xxx">
    <map oid="{string(self::xxx[not(xxxx/@*)] | xxxx/@*)}"
      id="{(position() + $first_map_count) * 2 - 1}">
      <xsl:value-of select=". | xxxx/@*"/>
    </map>
  </xsl:template>

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


Current Thread