|
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))) ) > 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 |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: Simple XPath question, Vun Kannon, David | Thread | XSLT choking on DTD?, disco |
| Re: Simple XPath question, Nikita Ogievetsky | Date | Re: Simple XPath question, Phil Lanch |
| Month |