This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: getting the node position in source xml in a variable
- From: Jeni Tennison <jeni at jenitennison dot com>
- To: Gurvinder Singh <GurvinderS at amdocs dot com>
- Cc: "'xsl-list at lists dot mulberrytech dot com'" <xsl-list at lists dot mulberrytech dot com>
- Date: Wed, 27 Feb 2002 11:36:56 +0000
- Subject: Re: [xsl] getting the node position in source xml in a variable
- Organization: Jeni Tennison Consulting Ltd
- References: <D1713728C4550440A0E4A0816702E75C02E375C4@cypmail1srv.corp.amdocs.com>
- Reply-to: xsl-list at lists dot mulberrytech dot com
Hi Gurvinder,
> I have a template which takes two node-sets as parameters. I loop
> thru one of these nodeset using for-each and output the node value
> along with the corresponding node in the second node-list. Now the
> problem is that it works fine if i dont have a sort but with sort
> only the first node list is sorted. So it takes the wrong
> corresponding values from the second node-list. because the position
> gives the position in the context. So i should use <xsl:number> but
> when i put the xsl:number in the variable it always gives 1. even
> the position() if inside <xsl:variable> gives always 1, but if used
> in select attribute of <xsl:variable> it works fine
I think that the problem is that when you turn a result tree fragment
into a node set (as you're doing with the msxsl:node-set() extension
function), you get back a node set containing a single root node. In
your template, you seem to be imagining that you're getting back the
children of this root node (the elements or whatever).
Try this slightly amended version:
<xsl:template name="lookup">
<xsl:param name="name"/>
<xsl:param name="datanodes"/>
<xsl:param name="displaynodes"/>
<select name="{$name}">
<xsl:for-each select="msxsl:node-set($displaynodes)/node()">
<xsl:sort select="." />
<xsl:variable name="num"
select="count(preceding-sibling::node()) + 1"/>
<xsl:variable name="data"
select="msxsl:node-set($datanodes)/node()[$num]" />
<option id="{$data}" value="{$data}">
<xsl:value-of select="$data"/>-<xsl:value-of select="."/>
</option>
</xsl:for-each>
</select>
</xsl:template>
I'd normally question the wisdom of passing in result tree fragments
as the values of the $datanodes and $displaynodes parameters, but
since you need to have control over their ordering, and the nodes need
to be siblings to get the numbering to work, it's probably a good
idea.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list