Subject: RE: Count Ancestors Up To But Not Including a Given Type
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 5 Feb 2008 09:52:13 -0000
|
Perhaps
<xsl:for-each-group select="reverse(ancestor::*[self::ol|self::ul])"
group-adjacent="node-name()">
<xsl:if test="position()=1">
<xsl:sequence select="count(current-group())"/>
</xsl:if>
</xsl:for-each-group>
That is, partition the ancestors into runs of ol or ul, and then get the
length of the first run.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Eliot Kimber [mailto:ekimber@xxxxxxxxxxxx]
> Sent: 05 February 2008 07:18
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Count Ancestors Up To But Not Including a Given Type
>
> Maybe it's the lateness of the hour but I'm finding myself
> stymied on what I hope is relatively simple check.
>
> In DITA, as in many doctypes, you can have nested lists of the form:
>
> <ol>
> <li>
> <ol>
> <li>
> </li>
> </ol>
> </li>
> </ol>
>
> As well as an intermixing of different list types, e.g.:
>
> <ol>
> <li>
> <ul>
> <li>
> <ol>
> <li>
>
>
> What I need to do is determine, for a given li, its depth of
> nesting within unbroken ancestry of a given list type.
>
> Thus, int the first example, the deepest li is a level 2
> because it has two ancestor <ol> elements with no intervening
> <ul> (or other non-list element that might occur within <li>
> and itself contain a list). In the second example, the
> deepest <li> is a level one because there is an intervening
> <ul> between the two <ol> ancestors.
>
> I can't for the life of me figure out either a single
> expression or a recursive function that will return the
> correct answer.
>
> What bit of logic am I failing to see? I am using XSLT 2.
>
> Thanks,
>
> ELiot
>
> --
> Eliot Kimber
> Senior Solutions Architect
> "Bringing Strategy, Content, and Technology Together"
> Main: 610.631.6770
> www.reallysi.com
> www.rsuitecms.com
|