Subject: Re: Designs for XSLT functions (Was: Re: [xsl] RE: syntax sugar for call-template) From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx> Date: Tue, 20 Feb 2001 18:12:19 +0000 |
Hi Uche, >> Firstly, as we know, key() and id() are restricted to finding nodes in >> the current tree. If I want to use an extension function that >> retrieves keyed nodes in a particular document then I need to be able >> to do: >> >> <exsl:function name="my:key"> >> <xsl:param name="key-name" /> >> <xsl:param name="key-value" /> >> <xsl:param name="file-name" /> >> <xsl:param name="base-node" select="/" /> >> <xsl:for-each select="document($file-name, $base-node)"> >> <exsl:result select="key($key-name, $key-value)" /> >> </xsl:for-each> >> </exsl:function> > > I see the general gist here. However, note that since XPath 1.0 > doesn't have a general list type (which I think is near imperative > for the next XPath) it could be quite a pain to validate the idea > that "multiple exsl:result" elements are allowed as long as each > evaluates to a node set". Oh, sorry - that wasn't the intention of my example. In the example above, I was assuming that $file-name was a string, and that therefore the xsl:for-each only selected one node - it's essentially being used to change the current node so that the call to key() uses that document as its scope. So the exsl:result would only actually occur once, and that would be the node set returned. If I wanted to make this work with multiple documents, I'd use a recursive solution: <exsl:function name="my:key"> <xsl:param name="key-name" /> <xsl:param name="key-value" /> <xsl:param name="file-names" /> <xsl:param name="base-node" select="/" /> <xsl:variable name="rest" select="my:key($key-name, $key-value, $file-names[position() > 1], $base-node)" /> <xsl:for-each select="document($file-name[1], $base-node)"> <exsl:result select="key($key-name, $key-value) | $rest" /> </xsl:for-each> </exsl:function> In other words: only one exsl:result element should be instantiated when the content of exsl:function is processed - if more than one is instantiated then only the first actually matters, the rest are ignored. Would that be implementable? Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: Designs for XSLT functions (Was, Uche Ogbuji | Thread | Re: Designs for XSLT functions (Was, Uche Ogbuji |
Re: Designs for XSLT functions (Was, Uche Ogbuji | Date | Re: Designs for XSLT functions (Was, Uche Ogbuji |
Month |