xsl-list
[Top] [All Lists]

[xsl] XSL performance question: running count of attributes using axes and sum()

2009-04-09 14:24:17

Dear Gents,

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!

In transforming the <syl> tags below into HTML table cells to display them, I 
need to format each cell with a green color with the running total of the 
@length attributes is a multiple of four. Ideally having the ability to do 
running totals in another variable would be great, but not the best XSL-esque 
solution, so I am using axes instead. I have tried solutions with count and 
sum, but performance is slow: 756 lines like the ones below mean thousands of 
syllables to check, each with its own axis computation -- the complete xform 
takes more than an hour!

Can anyone point me to a solution that is more performant yet still 
elegant/simple?

An aside: it seems that ceiling() is an Xpath1.0 function, but oddly enough not 
floor() -- Altova SPY complains about floor until I change the stylesheet to 
version 2.0 (sigh). I would love this to transform in XSL1.0 if possible, and 
rounding down each length to the integer is essential to acheive the correct 
formatting result.

Thanks in advance for any help on this.

XML:

<poem>
        <line id="1">
                <word id="1">
                        <syl length="2">Ar</syl>
                        <syl length="1">ma</syl>
                </word>
                <word id="2">
                        <syl length="1">vi</syl>
                        <syl length="2">rum</syl>
                </word>
                <syl length="1">que</syl>
                <word id="3">
                        <syl length="1">ca</syl>
                        <syl length="2">no</syl>
                </word> , 
                <word id="4">
                        <syl length="2">Tro</syl>
                        <syl length="2">iae</syl>
                </word>
                <word id="5">
                        <syl length="2">qui</syl>
                </word>
                <word id="6">
                        <syl length="2">pri</syl>
                        <syl length="1">mus</syl>
                </word>
                <word id="7">
                        <syl length="1">ab</syl>
                </word>
                <word id="8">
                        <syl length="2">o</syl>
                        <syl length="2">ris</syl>
                </word>
        </line>
        <line id="2">
                <word>
                        <syl length="2">li</syl>
                        <syl length="1.5">to</syl>
                        <syl length="1">ra</syl>
                </word> , 
                <word id="15">
                        <syl length="2">mul</syl>
                        <syl elide="true" length="1">tum</syl>
                </word>
                <word id="16">
                        <syl length="2">il</syl>
                        <syl elide="true" length="1">le</syl>
                </word>
                <word id="17">
                        <syl length="2">et</syl>
                </word>
                <word id="18">
                        <syl length="2">ter</syl>
                        <syl length="2">ris</syl>
                </word>
                <word id="19">
                        <syl length="2">iac</syl>
                        <syl length="2">ta</syl>
                        <syl length="1">tus</syl>
                </word>
                <word id="20">
                        <syl length="1">et</syl>
                </word>
                <word id="21">
                        <syl length="2">al</syl>
                        <syl length="2">to</syl>
                </word>
        </line>
</poem>


XSL template:

<xsl:template match="syl">

<xsl:variable name="line_id"><xsl:value-of select="node()/ancestor::line/@id" 
/></xsl:variable>

<xsl:variable name="current_quantity"><xsl:value-of 
select="sum(preceding::syl[ancestor::line/@id = $line_id and (not(@elide) or 
@elide='false') ]/floor(@length))" /></xsl:variable>

<xsl:variable name="color"><xsl:choose><xsl:when test="@length=2 and 
($current_quantity mod 4 = 
0)">background-color:#EEFFEE;</xsl:when></xsl:choose></xsl:variable>

<td style="{$color}"><xsl:value-of select="text()" /></td>

</xsl:template>


      


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