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
======================================================================