Subject: Re: [xsl] Finding sequences of same element From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx> Date: Wed, 9 Feb 2005 00:38:06 -0800 (PST) |
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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Finding sequences of same ele, Simon Kissane | Thread | RE: [xsl] Finding sequences of same, Michael Kay |
RE: [xsl] Can I use a boolean varia, Andrew Welch | Date | [xsl] Select and display a node, Sébastien Bicaïs |
Month |