xsl-list
[Top] [All Lists]

Siblings to hierarchy: Better way to do this?

2002-09-06 08:19:26
Dear All,

I need to transform stuff in this form:

<r>
        <section/>
        <paragraph>adolf</paragraph>
        <paragraph>alex</paragraph>
        <section/>
        <paragraph>bertram</paragraph>
        <paragraph>bilbo</paragraph>
        <paragraph>bumble</paragraph>
        <section/>
        <paragraph>claus</paragraph>
        <paragraph>charles</paragraph>
        <paragraph>cymbaline</paragraph>
</r>

to this:

<r>
        <section>
                <Para>adolf</Para>
                <Para>alex</Para>
        </section>
        <section>
                <Para>bertram</Para>
                <Para>bilbo</Para>
                <Para>bumble</Para>
        </section>
        <section>
                <Para>claus</Para>
                <Para>charles</Para>
                <Para>cymbaline</Para>
        </section>
</r>

The style-sheet which worked seems clumsy to me:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:template match="/">
                <r>
                        <xsl:apply-templates select="/r/section"/>
                </r>
        </xsl:template>
        <xsl:template match="section">
                <xsl:variable name="gid" select="generate-id()"/>
                <section>
<xsl:apply-templates select="following-sibling::paragraph[generate-id(preceding-sibling::section[1])=$gid]"/>
                </section>
        </xsl:template>
        <xsl:template match="paragraph">
                <Para>
                        <xsl:apply-templates/>
                </Para>
        </xsl:template>
</xsl:stylesheet>

Can anyone suggest something faster and/or more elegant please?

Also: I don't understand why this didn't work: if anyone can explain,
I'd be grateful:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:template match="/">
                <r>
                        <xsl:apply-templates select="/r/section"/>
                </r>
        </xsl:template>
        <xsl:template match="section">
                <xsl:variable name="sect" select="self::node()"/>
                <section>
<!-- match only paragraphs whose first preceding sibling is the section we are processing --> <xsl:apply-templates select="following-sibling::paragraph[preceding-sibling::section[1]=$sect]"/>
                </section>
        </xsl:template>
        <xsl:template match="paragraph">
                <Para>
                        <xsl:apply-templates/>
                </Para>
        </xsl:template>
</xsl:stylesheet>

Thank you,
Richard Bondi



XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



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