xsl-list
[Top] [All Lists]

Re: [xsl] Benefits of using xsl:key

2009-11-03 06:20:16
The example works convincingly!

By modifying the simple example by Michael Müller-Hillebrand:

Input.xml

<Doc>
    <value oid="f37">some text</value>
    <value oid="f61">some text</value>
    <value oid="f042">some other text</value>
</Doc>

Copy and pasting so we have 3000 lines.

And modifying his stylesheet to:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="2.0">
    <xsl:output indent="yes"/>

    <xsl:template match="value[.=preceding::value]">
        <xsl:copy>
            <!-- add attribute and skip content -->
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="xrefid"
select="preceding::value[.=current()][last()]/@oid"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Transformation with an old Saxon-B9 from inside Oxygen takes around 10s.

After using xsl:key and the following stylesheet:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="2.0">
    <xsl:output indent="yes"/>
    <xsl:key name="value-content" match="value" use="."/>

    <xsl:template match="value[.=preceding::value]">
        <xsl:variable name="first" select="key('value-content', .)[1]"/>
        <xsl:copy>
            <xsl:choose>
                <xsl:when test=". is $first">
                    <!-- pass through content -->
                    <xsl:apply-templates select="@*"/>
                    <xsl:apply-templates/>
                </xsl:when>
                <xsl:otherwise>
                    <!-- add attribute and skip content -->
                    <xsl:attribute name="xrefid" select="$first/@oid"/>
                    <xsl:apply-templates select="@*"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Transformation takes 0.1s, or is 100 times faster!

It turned out to be easy to construct an example after all. Thanks for
the help. Next I will test the nice example provided by MK.

Cheers,
Jesper

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