xsl-list
[Top] [All Lists]

RE: [xsl] Need test for preceding-sibling

2009-04-23 16:23:56
Now I see that I over-simplified the problem.  The XSLT also has to suppress 
any <a1> that is not paired with an <a2>.  So, I'm not sure the grouping works 
in your example since there could be two <a1/> elements that are in the group 
that ends with <a2/>.  But, if you specify:

        <xsl:for-each-group select="*"
                                group-starting-with="a1"
                       group-ending-with="a2">

will that consider "<a1/><a1/><a2/>" a group?

Dave

-----Original Message-----
From: Hintz, David L [mailto:david(_dot_)hintz(_at_)siemens(_dot_)com] 
Sent: Thursday, April 23, 2009 1:36 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Need test for preceding-sibling

Thanks, Ken!  I should have been clearer in my description.  Each <a1> and <a2> 
should be paired, even though there may be intervening tags.  However, an <a2> 
without its paired <a1> should not be processed.  I'll try your grouping 
solution.

Dave

-----Original Message-----
From: G. Ken Holman [mailto:gkholman(_at_)CraneSoftwrights(_dot_)com] 
Sent: Thursday, April 23, 2009 1:26 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Need test for preceding-sibling

At 2009-04-23 14:01 -0400, Hintz, David L wrote:
I have a structure like this:

<a1/>
<a2/>
<a1/>
<a2/>
<b/>
<c/>
<a2/>
<a1/>
<a2/>

I need to ensure that each <a2> has a preceding <a1>, although there 
may be intervening tags.

This description is a bit imprecise ... do you need them paired, or 
will any <a1> before an <a2> suffice?

I ask because in the example you have every <a2> has a preceding 
<a1>, some with intervening tags and some without.

But it isn't true that every <a2> has a preceding <a1> that follows 
any preceding <a2>.

I know that

        name(preceding-sibling::*[1]

gives me the name of the first preceding sibling, but how do I 
construct a test that gives me only the first preceding <a1> or <a2> tag?

You shouldn't be working with name() because that deals with strings 
and not expanded node names in a namespace-safe fashion.

The test that there is any <a1> before the current node being <a2> is:

    preceding-sibling::a1

The test that there is an <a1> correspondingly before every <a2> is 
approached more easily with XSLT 2 grouping from the parent of those siblings:

   <xsl:for-each-group select="*"
                       group-ending-with="a2">
     <xsl:if test="not(current-group()/self::a1)">
        Error!  No corresponding a1 for the given a2
     </xsl:if>
   </xsl:for-each-group>

I hope this helps.

. . . . . . . . . . . . Ken

--
XSLT/XSL-FO/XQuery hands-on training - Los Angeles, USA 2009-06-08
Training tools: Comprehensive interactive XSLT/XPath 1.0/2.0 video
Video lesson:    http://www.youtube.com/watch?v=PrNjJCh7Ppg&fmt=18
Video overview:  http://www.youtube.com/watch?v=VTiodiij6gE&fmt=18
G. Ken Holman                 mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Male Cancer Awareness Nov'07  http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers:  http://www.CraneSoftwrights.com/legal


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>