[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: RE: syntax sugar for call-template

Subject: Re: RE: syntax sugar for call-template
From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx>
Date: Fri, 16 Feb 2001 13:22:37 +0000
sugar generate id
Hi Francis,

>> Couldn't agree more strongly.  Thinking about Uche's comments on
>> run-time dynamism and introspection yesterday (I don't know what that
>> means but it sure sounds good) another option would be single new XSLT
>> function:
>> 
>>   call-template('my:func', 'one', xpath,
>>                            'two', $rtf)
>> 
>> I don't know whether this would be more or less acceptable than a
>> means of defining XSLT user extension functions?  The one big
>> limitation is that you wouldn't be able to return node sets (aside
>> from those constructed as an RTF) so there would be limitations on
>> this.
>
> I've been - perhaps lazily - assuming that the implicit RTF -> nodeset
> conversion would convert any node structure into the same structure you
> started with. For instance if I return a node-set of node-sets I'm
> expecting this to be what the calling expression receives. Do you know
> of any exceptions, or are you just being cautious?

Now I'm glad that I sent my previous message about the differences :)
I'll give an example to illustrate the point.  Say that I create a
template that gets nodes with unique values with:

<xsl:key name="default-key" match="node()" use="." />
<xsl:template name="my:distinct">
   <xsl:param name="nodes" select="/.." />
   <xsl:param name="key" select="'default-key'" />
   <xsl:for-each select="$nodes[count(.|key($key, .)[1]) = 1]">
      <xsl:copy-of select="." />
   </xsl:for-each>
</xsl:template>

Now, let's say that I have a set of books with topics on them
(subelements) and I want to group them by topic. Assuming shorthand
syntax with positional parameters, I could get the unique topics with:

   my:distinct(book/topic, 'topics')/topic

(assuming: <xsl:key name="topics" match="book/topic" use="." />)

That might be sufficient.  After all, I could then do:

  book[topic = my:distinct(../book/topic, 'topics')/topic]/name

to get the names of the books. However, I could *not* get the names of
the books with:

  my:distinct(book/topic, 'topics')/topic/parent::book/name

because the only nodes that have been copied into the RTF are the
topic subelements. I've lost the information about ancestry. It's not
a problem if you don't care about ancestry, but you often do. And
there are other things that cause problems, like doing later unions,
using their generated-id() and their base URI.

A way around this is to use references with generate-id() rather than
simply copying the relevant nodes:

<xsl:key name="default-key" match="node()" use="." />
<xsl:template name="my:distinct">
   <xsl:param name="nodes" select="/.." />
   <xsl:param name="key" select="'default-key'" />
   <xsl:for-each select="$nodes[count(.|key($key, .)[1]) = 1]">
      <node id="{generate-id()}" />
   </xsl:for-each>
</xsl:template>

You can then do:

  book/topic[generate-id() =
             my:distinct(../../book/topic, 'topics')/node/@id]

to get the node set that you're after.  It's unweildy, but it would be
usable without introducing a new xsl:return element of any kind.

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/



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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.