Subject: RE: [xsl] Counting nodes efficiently From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> Date: Thu, 19 Feb 2004 11:57:31 -0500 |
In this and similar problems one can re-use the identity transformation, which processes strictly one node at a time (would a native English speaker, please, suggest a good name? The best I could arrive at was "one node at a time identity transformation"):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes"/>
<xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="node()[1]"/> </xsl:copy> <xsl:apply-templates select="following-sibling::node()[1]"/> </xsl:template>
</xsl:stylesheet>
Cheers, Wendell
This transformation produces the same results as the more well-known identity rule.
The difference is that we now have the finest possible grain-level of controll as every xsl:apply-templates instruction above always selects at most one node.
It is trivial to add parameters and to override the one-at-a-time identity for elements. Thus we finally have:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes"/>
<xsl:template match="@* | node()"> <xsl:param name="pnAncestors" select="0"/> <xsl:param name="pnPreceding" select="0"/> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="node()[1]"> <xsl:with-param name="pnAncestors" select="$pnAncestors+1"/> <xsl:with-param name="pnPreceding" select="$pnPreceding"/> </xsl:apply-templates> </xsl:copy> <xsl:apply-templates select="following-sibling::node()[1]"> <xsl:with-param name="pnAncestors" select="$pnAncestors"/> <xsl:with-param name="pnPreceding" select="$pnPreceding+1"/>
</xsl:apply-templates> </xsl:template>
<xsl:template match="*"> <xsl:param name="pnAncestors" select="0"/> <xsl:param name="pnPreceding" select="0"/>
<xsl:copy> <xsl:copy-of select="@*"/> <xsl:attribute name="_id"> <xsl:value-of select= "concat(name(), '_', $pnAncestors, '_', $pnPreceding )"/> </xsl:attribute> </xsl:copy> <xsl:apply-templates select="node()[1]"> <xsl:with-param name="pnAncestors" select="$pnAncestors+1"/> <xsl:with-param name="pnPreceding" select="$pnPreceding"/> </xsl:apply-templates> <xsl:apply-templates select="following-sibling::node()[1]"> <xsl:with-param name="pnAncestors" select="$pnAncestors"/> <xsl:with-param name="pnPreceding" select="$pnPreceding+1"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
This transformation is not long, it can be written almost mechanically, it makes exactly one pass over the tree and it has a linear time complexity (checked with inputs of different size).
Cheers,
Dimitre Novatchev FXSL developer,
http://fxsl.sourceforge.net/ -- the home of FXSL Resume: http://fxsl.sf.net/DNovatchev/Resume/Res.html
__________________________________ Do you Yahoo!? Yahoo! Mail SpamGuard - Read only the mail you want. http://antispam.yahoo.com/tools
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
====================================================================== Wendell Piez mailto:wapiez@xxxxxxxxxxxxxxxx Mulberry Technologies, Inc. http://www.mulberrytech.com 17 West Jefferson Street Direct Phone: 301/315-9635 Suite 207 Phone: 301/315-9631 Rockville, MD 20850 Fax: 301/315-8285 ---------------------------------------------------------------------- Mulberry Technologies: A Consultancy Specializing in SGML and XML ======================================================================
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Counting nodes efficientl, Wendell Piez | Thread | [xsl] Re: Counting nodes efficientl, Dimitre Novatchev |
[xsl] Arabic text rising high above, Donald Smith | Date | [xsl] Re: Resolving ambiguities whe, Wendell Piez |
Month |