Re: Simple XPath question

Subject: Re: Simple XPath question
From: Phil Lanch <phil@xxxxxxxxxxxxxxx>
Date: Mon, 22 Nov 1999 17:08:33 +0000
"Vun Kannon, David" wrote:
> 
>         Shouldn't the concatenated string Phil constructs below be the use
> attribute of a key:
> <key name="FL" match="PERSON" use="concat(string-length(@firstname),
> ' ',concat(@firstname,@lastname))"/>
> 
>         Then the function
> key('FL',concat(string-length(@firstname),' ',concat(@firstname,@lastname)))
> could be used in an expression to find node sets of size > 1. That XT hasn't
> implemented the key stuff yet limits my ability to test this conjecture.

Ah. I was nowhere near coming up with that.

It looks good to me.

How about ...

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
    <xsl:key name="FL" match="PERSON"
    use="concat(string-length(@firstname),'
',concat(@firstname,@lastname))"/>

    <xsl:template match="/">
	<xsl:apply-templates
	select="//PERSON[ count( key('FL',concat(string-length(@firstname),' ',
	concat(@firstname,@lastname))) ) &gt; 1 ]"/>
    </xsl:template>

    <xsl:template match="PERSON">
	... process a non-unique person ...
    </xsl:template>
</xsl:stylesheet>

... I haven't been able to test this, either.

The downside is that keys are (of course) only part of XSLT, not XPath,
and Paul originally asked whether a pure XPath solution was possible.

Well, at least we haven't used variables.

A 'Simple XPath question', indeed ...

>         BTW, is this concat idiom the right way to construct a key whose
> value spans more than one node?

It's cetainly not elegant.
Any better ideas would be appreciated.

> Cheers,
> David vun Kannon
> 
> -----Original Message-----
> From: Phil Lanch [mailto:phil@xxxxxxxxxxxxxxx]
> 
> David Carlisle wrote:
> >
> > It doesn't work as
> > >  following-sibling::PERSON/@lastname = ./@lastname and
> > >  following-sibling::PERSON/@firstname = ./@firstname
> >
> > does not force that it is the same following-sibling. ie it selects
> > a PERSON if some later person has the same firstname, and a third person
> > has the same lastname.  You can make the selection in various ways in
> > xslt but I suspect Paul is right that you can't do it in a single
> > xpath expression unless you give yourself an extension function that
> > (say) returns a string uniquely generated from the firstname and
> > lastname attributes of an element node, then you could do
> >
> > dpc:bothnames(following-sibling::PERSON)=dpc:bothnames(PERSON)
> 
> Using just the built-in functions,
> it's possible to get a string uniquely generated from the firstname and
> lastname attributes of _one_ element node, e.g.:
> 
> concat(string-length(@firstname),' ',concat(@firstname,@lastname))
> 
> The problem is that we need your
> 
> dpc:bothnames(following-sibling::PERSON)
> 
> function to return a list of these uniquely generated strings,
> and a list of strings
> (as opposed to a list of nodes that happen to be text nodes)
> is of course not a valid XPath type.

-- 

cheers

phil

'"having more of a life is one of the earliest
  and subtlest signs of mediocrity"' --- Musil


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread