Subject: Re: [xsl] Converting a string to node test From: Xavier Cazin <cazinx@xxxxxxxxx> Date: 22 Apr 2001 11:47:48 +0200 |
On Sat, 21 Apr 2001, davidc@xxxxxxxxx wrote: > >> Do you know the secret? > this is a FAQ I think. Argh. This is the kind of FAQ very hard to track (in which section(s) should it fall?) >> <xsl:copy-of select="$x[@$y=$z]/node()"/> > > @$y doesn't mean anything as you observed. > > If $y is a string with a name of an attribute then you can go > <xsl:copy-of select="$x[@*[name()=$y and .=$z]]/node()"/> Another nice version of Jeni's solution, thank you! It seems so simple once someone shows you :-) > but usually it's more fun to pass in the node you want rather than > mess with names. Variables in XSLT are not restricted to strings > so you can pass nodes around. > > You didn't show how you were calling your template but rather than pass > <xsl:with-param name="x" select="foo"/> > <xsl:with-param name="y" select="'attr'"/> > > you may be able to do > > <xsl:with-param name="x" select="foo"/> > <xsl:with-param name="y" select="foo[@attr']/> I like this solution, but I'm not sure it is easy to implement for me, since I wanted the various parameters to come from different documents, one of them being a configuration file. The variable y rather acts as a key in the config file. In case you are interested, here the relevant excerpt of the config file: <preferred-order criterium="location"> <value>default</value> <value>work</value> <value>home</value> <value when="travelling">transit</value> </preferred-order> The higher level call to the template (x becomes item and y becomes criterium): <xsl:variable name="selected-addresses"> <xsl:call-template name="preferred-item"> <xsl:with-param name="item" select="address"/> <xsl:with-param name="criterium" select="'location'"/> </xsl:call-template> </xsl:variable> And the recursive (wannabe generic) template itself: <xsl:template name="preferred-item"> <xsl:param name="item"/> <xsl:param name="criterium"/> <xsl:param name="criterium-rank" select="1"/> <xsl:variable name="current-preferred-criterium" select="$config-tree/preferred-order[@criterium=$criterium]/value[$criterium-rank]"/> <xsl:variable name="hit"> <!-- Here was the problem you solved --> <xsl:copy-of select="$item[@*[local-name() = $criterium] = $current-preferred-criterium]/node()"/> </xsl:variable> <xsl:if test="not(xt:node-set($hit)/node())"><!-- nothing found ? --> <xsl:call-template name="preferred-item"> <xsl:with-param name="item" select="$item"/> <xsl:with-param name="criterium" select="$criterium"/> <xsl:with-param name="criterium-rank" select="$criterium-rank + 1"/> </xsl:call-template> </xsl:if> <xsl:copy-of select="$hit"/> </xsl:template> If you see a way to make this a three lines template, please be diplomatic, as I spend more hours on this that I expected :-)) Anyway, thanks again! Xavier. XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Converting a string to no, David Carlisle | Thread | Re: [xsl] Converting a string to no, David Carlisle |
[xsl] Experiences with Mathml and c, D. van den Bos - RJ | Date | Re: [xsl] namespace problem, Jeni Tennison |
Month |