RE: [xsl] matching elements of a list

Subject: RE: [xsl] matching elements of a list
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 8 May 2007 09:37:40 +0100
This is a recursive query, and is therefore beyond the scope of XPath alone:
it needs recursive functions. But it's easy in XSLT (untested!):

<xsl:key name="k" match="ln" use="@s"/>

<xsl:function name="my:children" as="xs:string*">
  <xsl:param name="parent" as="xs:string"/>
  <xsl:sequence select="key('k', $parent)/@d"/>
</xsl:function>

<xsl:function name="my:descendants" as="xs:string*">
  <xsl:param name="parent" as="xs:string"/>
  <xsl:variable name="children" select="my:children($parent)"/>
  <xsl:sequence select="$children, for $c in $children return
my:descendants($c)"/>
</xsl:function>  

A bit harder if you need to add a check for cycles, but still doable.

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: Rolf Schumacher [mailto:mailinglist@xxxxxxxxx] 
> Sent: 08 May 2007 06:01
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] matching elements of a list
> 
> do I have reached the limits of xpath?
> 
> if several linked lists are contained in one document how to 
> match all nodes belonging to a specific start node?
> 
> The following example may illustrate my question:
> 
> Input:
> <root>
>     <st ix="a"/>
>     <st ix="b"/>
>     <el ix="c"/>
>     <el ix="d"/>
>     <el ix="e"/>
>     <el ix="f"/>
>     <el ix="g"/>
> 
>     <ln s="a" d="g"/>
>     <ln s="g" d="f"/>
> 
>     <ln s="b" d="e"/>
>     <ln s="e" d="c"/>
>     <ln s="c" d="d"/>
> </root>
> 
> disired output:
> 
> a: g f
> b: e c d
> 
> How to accomplish that by XSLT (2.0)?
> Even your answer "I know for sure that there is not elegant way"
> or "You got to extend the processor by some Java function"
> would help.

Current Thread