Another option would be to predefine the nodeset of eligible B nodes, using
Michael's suggestion, and then in the foreach just test to see whether each B
is in that nodeset.
Alternatively, although it was not specified in the example XML, if there could
be other non-A and non-B nodes interspersed among the B's, then just testing
the first following-sibling won't work. In that case, perhaps something like
this would work:
test="generate-id(.) =
generate-id(following-sibling::A[1]/preceding-sibling::B[1])"
David.
--
David McNally Moody's Investors Service
Senior Software Engineer 99 Church St, NY NY 10007
David(_dot_)McNally(_at_)Moodys(_dot_)com 212-553-7475
-----Original Message-----
From: Wendell Piez [mailto:wapiez(_at_)mulberrytech(_dot_)com]
Sent: Wednesday, June 30, 2004 11:31 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Testing for a following sibling node type
that occurs a t a varied position
At 03:20 AM 6/30/2004, someone wrote:
I changed your test a little, so I detect all the last 'B'
by testing
if the name of the actual node differs from the name of the
following
node. I hope this will help you
-----------------------------------------
<xsl:template match="root">
<xsl:for-each select="B">
<xsl:if test="not(name() = name(following-sibling::*))">
<xsl:value-of select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
-----------------------------------------
Given that it is known, in this test, that the context node
is a 'B', this
could be
<xsl:for-each select="B">
<xsl:if test="not(following-sibling::B)">
<xsl:value-of select="." />
</xsl:if>
</xsl:for-each>
.. but I don't think it answers the OP's requirement.
As I recall, Mike suggested child::A/preceding-sibling::B[1],
which isn't
considered adequate because the context node is already a B,
not the parent
of the As and Bs. So the requirement is not to *select* all B
nodes that
have no Bs after them before As, but to test true on a B
context node that
is (as the OP said) "the last 'B' node that occurs before the
next 'A' node".
In other words, the context node is a B, and the test should
detect that
the directly following sibling is not a B, but that there is
an A following
sibling.
This is
test="following-sibling::*[1][not(self::B)] and following-sibling::A"
Cheers,
Wendell
======================================================================
Wendell Piez
mailto:wapiez(_at_)mulberrytech(_dot_)com
Mulberry Technologies, Inc. http://www.mulberrytech.com
17 West Jefferson Street Direct Phone: 301/315-9635
Suite 207 Phone: 301/315-9631
Rockville, MD 20850 Fax: 301/315-8285
----------------------------------------------------------------------
Mulberry Technologies: A Consultancy Specializing in SGML
and XML
======================================================================
--+------------------------------------------------------------------
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>
--+--
---------------------------------------
The information contained in this e-mail message, and any attachment thereto,
is confidential and may not be disclosed without our express permission. If
you are not the intended recipient or an employee or agent responsible for
delivering this message to the intended recipient, you are hereby notified that
you have received this message in error and that any review, dissemination,
distribution or copying of this message, or any attachment thereto, in whole or
in part, is strictly prohibited. If you have received this message in error,
please immediately notify us by telephone, fax or e-mail and delete the message
and all of its attachments. Thank you.
Every effort is made to keep our network free from viruses. You should,
however, review this e-mail message, as well as any attachment thereto, for
viruses. We take no responsibility and have no liability for any computer
virus which may be transferred via this e-mail message.