Subject: Re: [xsl] XSLT: XPath: Sets From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx> Date: Tue, 27 Feb 2001 17:55:03 +0000 |
Hi Lee, > Is it possible to apply one template to every first-level node > (/ROOT/*) in a document and have the template output a mark if the > passed node is the first of its kind? So that in the example below, > <X a="1"/> would be marked but not <X a="2"/>? You can test whether a node is the first with that name within its siblings by seeing if there are any preceding siblings to it that have the same name, i.e.: preceding-sibling::*[name() = name(current())] So you could do something along the lines of: <xsl:template match="/*/*"> <xsl:choose> <xsl:when test="preceding-sibling::*[name() = name(current())]"> ... first of its kind ... </xsl:when> <xsl:otherwise> ... later elements ... </xsl:otherwise> </xsl:choose> </xsl:template> If you've got a long document you may find it more efficient to create a key so that you can quickly retrieve all the elements with a particular name: <xsl:key name="elements-by-name" match="/*/*" use="name()" /> You can then test whether the current node is the first with a name with: count(.|key('elements-by-name', name())[1]) = 1 or: generate-id() = generate-id(key('elements-by-name', name())) These both test whether the current element is the first element returned by the key for that particular key value (the name of the element). I hope that helps, Jeni --- Jeni Tennison http://www.jenitennison.com/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] XSLT: XPath: Sets, Lee Goddard | Thread | RE: [xsl] TransformerFactory.newIns, Vasu Durgavarjhula |
RE: [xsl] RE:"*NEVER* use for-each", Duffey, Kevin | Date | Re: [xsl] XSLT: Xpath: sets: positi, Lee Goddard |
Month |