|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Finding sequences of same element
Hi Simon,
Please try this XSL -
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/A">
<A>
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="not(self::B)">
<xsl:copy-of select="." />
</xsl:when>
<xsl:when test="name(preceding-sibling::*[1])
!= 'B'">
<D>
<xsl:copy-of select="." />
<xsl:call-template name="create-group">
<xsl:with-param name="list"
select="following-sibling::*" />
</xsl:call-template>
</D>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</A>
</xsl:template>
<xsl:template name="create-group">
<xsl:param name="list" />
<xsl:if test="name($list[1]) = 'B'">
<xsl:copy-of select="$list[1]" />
<xsl:call-template name="create-group">
<xsl:with-param name="list"
select="$list[position() > 1]" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Regards,
Mukul
--- Simon Kissane <skissane@xxxxxxxxx> wrote:
> Hi
>
> Suppose I have an input document:
> <A><B X="1"/><B X="2"/><B X="3"/><C X="4"/><B
> X="5"/><B X="6"/><B X="7"/></A>
>
> Now, suppose I wish to group together consecutive B
> elements, giving a
> result document like this:
> <A><D><B X="1"/><B X="2"/><B X="3"/></D><C
> X="4"/><D><B X="5"/><B
> X="6"/><B X="7"/></D></A>
>
> How can I do this? (I would prefer not to use
> recursive templates, but
> rather for-each, if that is at all possible...)
>
> I think I can find the initial element of these
> sequences, like so:
> B[not(preceding-sibling::*) or
> preceding-sibling::*[0][not(self::B)]]
> This, I think, should select all B for which there
> are either no
> preceeding sibling elements, or for which the
> immediately preceeding
> sibling element is not a B element. Thus, in the
> above example, it
> would pick B[@X=1] and B[@X=5].
>
> But, given each initial sequence element, how can I
> find the remaining
> nodes in the sequence? With the initial sequence
> element as the
> context node, I could do:
> .|following-sibling::B
> But that will also pick up B[@X=5] and B[@X=6] when
> the context node is B[@X=1].
>
> Is there a predicate test I could use on
> following-sibling::B to
> restrict it only to the current sequence of B
> elements?
>
> Thanks
>
> Simon Kissane
__________________________________
Do you Yahoo!?
The all-new My Yahoo! - What will yours do?
http://my.yahoo.com
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








