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 |