xsl-list
[Top] [All Lists]

Re: [xsl] xpath key problems

2010-11-21 15:01:50
Birnbaum, David J wrote:

Dear XSLT List,

I'd be grateful for advice about a problem I'm having with the use of
keys.
......
    <xsl:key name="msline-pb" match="hm281 | hm280 | hm282"
        use="preceding::pb[parent::*/name() eq name()][1]/@folio"/>
......
            <pointer>
                <xsl:value-of select="key('msline-pb',.)"/>
            </pointer>

You have your key backwards. It finds the manuscript entries (hm281 | hm280 | 
hm282) and it uses the foloi numbers to find them. Instead you want to find 
folio numbers and give it a manuscript entry to find it. The key() call more or 
less tries this.

As the key values will be atomized you must create a unique atomized value for 
each manuscript entry. You can do this with generate-id(). The key must only 
give manuscript entries which have a pb child, otherwise we can't get a folio 
out of it. Oh yes, we also have to include "ourselves" in the key. With this I 
get the following:

    <xsl:key name="msline-pb" match="hm281[pb] | hm280[pb] | hm282[pb]" 
use="(generate-id(.),following::*[name() eq current()/name()]/generate-id(.))"/>

I.e. all the following hm* entries with the same name are used as keys to find 
the entry with the pb child (and we use generate-id() to create the search 
value). It would be better to stop the key values at the next entry which has a 
pb child but this is left as an exercise for the reader :)

To retrieve the folio number:

<xsl:value-of 
select="key('msline-pb',generate-id(.))[position()=last()]/pb/@folio"/>

Because we don't stop at the next pb entry we have to get the last of the 
retrieved hm* entries and obtain its folio.

It would probably also be faster to split the key in 3 keys, one for each hm* 
kind. Actually I am curious how much speed-up this key gives, if any.
-- 
Piet van Oostrum
Cochabamba. URL: http://pietvanoostrum.com/
Nu Fair Trade woonartikelen op http://www.zylja.com

--~------------------------------------------------------------------
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>
--~--

<Prev in Thread] Current Thread [Next in Thread>