Re: [xsl] selecting nodes based on sibling values

Subject: Re: [xsl] selecting nodes based on sibling values
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Tue, 23 Nov 2010 10:20:32 -0500
Fabien,

At 09:45 AM 11/23/2010, you wrote:
Let's say I have an XML like below...

<data>
        <row>
                <level>40</level>
                <keycode>1254.45.12</keycode>
        </row>
        <row>
                <level>50</level>
                <keycode>1254.45.12.7</keycode>
        </row>
        <row>
                <level>50</level>
                <keycode>1254.45.12.8</keycode>
        </row>
        <row>
                <level>50</level>
                <keycode>1254.45.12.9</keycode>
        </row>

        <row>
                <level>40</level>
                <keycode>99.25.6</keycode>
        </row>
        <row>
                <level>50</level>
                <keycode>99.25.6.45</keycode>
        </row>
        <row>
                <level>50</level>
                <keycode>99.25.6.46</keycode>
        </row>
</data>

What could be the XPath expression to get the maximum number of nodes of
level=50 in data those keycode starts like the level=40 line ?
Here the answer would be 3 as the maximum number of level = 50 nodes for
a given level = 40 is 3
I have tried several things, but I am stuck....
(I am using XSLT 2.0 on Saxon)

This is a bit tricky since associating the level 50 nodes with the level 40 nodes is a bit tricky.


One way to do this is using a key (an old 1.0 upconversion trick):

<xsl:key name="get-level-50" match="row[level='50']"
  use="generate-id(preceding-sibling::row[level='40'][1])"/>

This enables you to get all the level 40 rows that belongs to any level 50 row, using that row as context.

Then we can get a sequence representing the values of the counts like so:

//row[level='40']/count(key('get-level-50',generate-id(.))

and the max:

max(//row[level='40']/count(key('get-level-50',generate-id(.)))

Note: untested; watch out for typos.

Cheers,
Wendell



======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
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
======================================================================

Current Thread