Re: XSL performance question: running count of attribu
I think your solution is in multiple passes. Preprocess your data to make your values explicit for the presentation phase.
There are a number of ways you could go about it, but I'd consider something like this:
1. annotate words with number of syllables in each (i.e., make word/@length explicit)
1b. optionally, do the same with lines
2. Use a sibling-recursion approach to calculate offsets at whatever level(s) (syllable, word and/or line) you like
3. Then work from the offsets instead of the brute-force calculations
Sibling recursion works like this:
<xsl:template match="x" mode="add-offsets"/> <xsl:param name="offset" select="0"/> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:attribute name="offset"> <xsl:value-of select="$offset"/> </xsl:attribute> </xsl:copy> <xsl:apply-templates select="following-sibling::x" mode="add-offsets"> <xsl:with-param name="offset" select="$offset + @length"/> </xsl:apply-templates> </xsl:template>
You would kick this off by applying templates to the x (only) of any sequence of x siblings. As you can see, it goes forward among x element siblings until there aren't any left. Essentially, the technique is to force a forward traversal of the document, which allows passing parameters along. Ordinarily one doesn't want to do this since it prevents the processor from optimizing its traversal -- but if you need to do some kinds of intensive calculations in document-wide scope (as here), it can be worth it.
Preprocessing to calculate lengths of words and lines would enable you to get around how your syllables are not all siblings, thereby allowing calculation of total offsets instead of just offsets relative to their containers. Another possibility for dealing with this would be to use the following:: axis not the following-sibling:: axis, but (depending on the processor) you might not see the same speed gains there.
On the other hand, depending on the size of the data set, you might find that simply preprocessing to calculate lengths at the word and line level, and not doing the calculation of offsets, helps enough by itself.
If you could use XSLT 2.0, you'd have more options and techniques at your disposal.
Also, some processors have extensions that are useful for this sort of thing.
floor() is an XSLT 1.0 function, and a conformant processor will respect it.
Getting quite comfortable using XSL. Since I am using alot more heavy-duty XSL, I am now hitting barriers with performance. My quesiton to the forum is for once, not a beginner's question!
====================================================================== 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 ======================================================================
PURCHASE STYLUS STUDIO ONLINE TODAY!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Download The World's Best XML IDE!
Accelerate XML development with our award-winning XML IDE - Download a free trial today!
Subscribe in XML format