xsl-list
[Top] [All Lists]

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

2006-08-02 08:17:55
On 8/2/06, David Carlisle <davidc(_at_)nag(_dot_)co(_dot_)uk> 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>

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--