Re: [xsl] slicing an XML document

Subject: Re: [xsl] slicing an XML document
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Tue, 15 Oct 2002 18:20:57 -0400

In XSLT 1.0 I'd de-duplicate the list using a key, in which the key value combines the node's name with its depth:

<xsl:key name="nodes-by-depth-and-name" match="*" use="concat(count(ancestor-or-self::*), ':', local-name())"/>

This allows you to slip a test into your for-each:

<xsl:template match="/">
<xsl:for-each select="//*[count(ancestor-or-self::*) = $depth]">
<xsl:if test="count(. | key('nodes-by-depth-and-name', concat($depth, ':', local-name()))[1]) = 1">
<!-- the test will be true only when the node is the first with its name and depth -->

This is an adaptation of a Muenchian grouping technique: the key puts all the elements with the same depth and name into a group (retrieved by the key), and the test throws out all but the first in each group.

I don't know why this isn't working on your real data but it is on your pizza sample; it's not because the technique doesn't hold up at different and variable depths (it does).


At 05:16 PM 10/15/2002, you wrote:
On Tue, 15 Oct 2002, Wendell Piez wrote:

> You could do something like:
> <xsl:param name="depth" select="3"/>
> <xsl:template match="/">
>    <xsl:for-each select="//*[count(ancestor-or-self::*) = $depth]">
>      <xsl:copy/>
>    </xsl:for-each>
> </xsl:template>
> This doesn't de-duplicate the list however (that's a little fancier).

Any insight into how I might go about de-duplicating the list?
Is a unique() function available in any extensions?

Thank You and Best Regards,

S. Perugini

Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.      
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
  Mulberry Technologies: A Consultancy Specializing in SGML and XML

XSL-List info and archive:

Current Thread