RE: [xsl] Complex group-by with saxon:evaluate?

Subject: RE: [xsl] Complex group-by with saxon:evaluate?
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 27 Sep 2006 15:57:31 +0100
> Ok, so here's the whole relevant xsl snippet
> 01: <ul>
> 02: <xsl:for-each-group select="bibtex:entry"
> group-by="tokenize(normalize-space(*/bibtex:refgroup),' *; *')">
> 03:     <xsl:sort select="current-grouping-key()" order="ascending"/>
> 04:       <li><xsl:value-of select="current-grouping-key()"/></li>
> 05:   </xsl:for-each-group>
> 06: </ul>
> 
> A:
>   Now, I first replaced line 2 above with:
>     02: <xsl:for-each-group select="bibtex:entry"
> group-by="tokenize(normalize-space(*[name()=$groupby]),' *; *')">

That should have been

group-by="tokenize(normalize-space(*/*[name()=$groupby]),' *; *')"
> 
> C:
> (with saxon:evaluate)
>   I ... changed line 2 above to
>     02: <xsl:for-each-group select="bibtex:entry"
> group-by="tokenize(normalize-space(saxon:evaluate('*/$groupby'
> )),' *; *')">

That should have been

group-by="tokenize(normalize-space(saxon:evaluate(concat('*/', $groupby)),'
*; *')"

Variables don't work by textual substitution, even in saxon:evaluate! You
must first construct an expression that contains the element name in a
position where an element name is expected, then you must evaluate the
expression you have constructed. The concat() constructs the expression, the
saxon:evaluate() evaluates it.

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

Current Thread