|
Subject: Re: [xsl] Preceding siblings test From: Lars Huttar <lars_huttar@xxxxxxx> Date: Tue, 14 Sep 2010 13:33:41 -0500 |
On 9/14/2010 10:23 AM, Martin Honnen wrote:
> Hintz, David wrote:
>
>> I'm still a novice at XSLT and am having a problem coming up with a
>> test for elements preceding a particular element, but only up to the
>> first occurrence of the same (or parent) element. For example, in
>> this XML:
>>
>> <list>
>> <a/>
>> <item>...</item>
>> <b/><b/><a/>
>> <item>...</item>
>> <item>...</item>
>> <a/><a/>
>> <item>...</item>
>> </list>
>>
>> Assume in this example, <a> and <b> elements can occur before each
>> item (any number of each). When I start processing an <item>, how do
>> I get a list of just those nodes before the first preceding <item> or
>> parent <list> element?
>
> With XSLT 2.0 you can use the XPath 2.0 '>>' operator
> <xsl:template match="item">
> <xsl:variable name="preceding-item"
> select="preceding-sibling::item[1]"/>
> <xsl:variable name="preceding-abs" select="preceding-sibling:a[.
> >> $preceding-item] | preceding-sibling:b[. >>
> $preceding-item]"/>
> </xsl:template>
>
Whoa! The things I didn't know I didn't know about XSLT 2.0... like this
>> operator! Thanks Martin.
A few notes for David about the above code...
1) It isn't necessary to escape '>'. So you can make it more readable.
2) The XPath for preceding-abs has a typo: single colons instead of
double, for the preceding-sibling axis.
3) You can make the XPath expression a little shorter and less redundant
by factoring out the p-s axis and the predicate, combining a and b via
"[self::a or self::b]".
Thus:
<xsl:variable name="preceding-abs"
select="preceding-sibling::*[self::a or self::b][. >> $preceding-item]"/>
Lars
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Preceding siblings test, Hermann Stamm-Wilbra | Thread | [xsl] [ANN] Release of SketchPath-P, Philip Fearon |
| RE: [xsl] Preceding siblings test, Hintz, David | Date | [xsl] Matching a local scope name, David |
| Month |