Re: [xsl] For-each and keys()

Subject: Re: [xsl] For-each and keys()
From: Steve <subsume@xxxxxxxxx>
Date: Wed, 2 Aug 2006 11:17:28 -0400
On 8/2/06, David Carlisle <davidc@xxxxxxxxx> wrote:
> XSL goes something like:

>> <xsl:for-each select="$Definitions">
>>   <xsl:value-of select="count(key('oldID',$current))" />
>> </xsl:for-each>
>I really don't understand this.

key() returns all the nodes that match the key _in the current document_
so if you want to look up keys in a different document then (in xslt1)
you need touse  xsl:for-each  to make that document current.
In XSLT2 you could equivalently go
<xsl:value-of select="$Definitions/count(key('oldID',$current))
or
<xsl:value-of select="count(key('oldID',$current,$Definitions))

Ahh, if only. The for-each you mention is what I am attempting, however, I've gotten no better idea than that (The How gets me, not the What).

> I really don't understand this.  I should mention there are many other
> branches within $Definitions besides /disabilities.
If $Definitions is defined using document() then it will represent a
well formed document so there can be at most one top level element
(presumably <disabilities>) so I do not see what you can mean by "other
branches"

Disabilities is not the top-level of that document. That is what I meant.


Given that, does that help you understand why the output is not meaningful?

You seem to know, given the way you mention for-each. Perhaps then you
can tell me where the code I have errs.

Here's what I've got. (as short as I can possibly make it).

<xsl:key name="options" match="option" use="@type" />
<xsl:key name="oldID" match="option" use="@oldID" />
<xsl:template match="Record" mode="x">
	<xsl:param name="type" />
	<tr>
		<td>
			<xsl:value-of select="$type" />
		</td>
		<td>
			<xsl:variable name="current" select="disabPrimary" />
			<xsl:for-each select="$cilDefinitions">
				<xsl:value-of select="count(key('oldID',$current))" />
			</xsl:for-each>
		</td>
	</tr>
</xsl:template>
<xsl:template match="/" >
			<table>
				<xsl:for-each
select="$Definitions/disabilities/option[generate-id(.)=generate-id(key('options',@type)[1])]">
					<xsl:sort select="@type"/>
					<xsl:apply-templates mode="x" select="$vP2/Records/Record">
						<xsl:with-param name="type" select="@type" />
					</xsl:apply-templates>
				</xsl:for-each>
			</table>
</xsl:template>

Current Thread