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