RE: [xsl] Optimizing XSLT iteration

Subject: RE: [xsl] Optimizing XSLT iteration
From: "Scott Trenda" <Scott.Trenda@xxxxxxxx>
Date: Mon, 8 Oct 2007 09:12:27 -0500
... Just out of curiosity here (it may be a business requirement or
whatnot, I don't know), why are you trying to construct an SVG path out
of (what looks to be) ellipse creation information? Why not just
something like:
<ellipse transform="rotate({@ellipse_angle})" cx="{@x}" cy="{@y}"
rx="{@ellipse_major_radius}" ry="{@ellipse_minor_radius}"/>?

~ Scott


-----Original Message-----
From: Sujata Gohad [mailto:sgohad@xxxxxxx]
Sent: Sunday, October 07, 2007 4:50 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [xsl] Optimizing XSLT iteration

Hello folks,

I have an XML file in the format:

<document src="image.tif" >
  <page x="0" y= "0" width="1012" height="506" >
    <attribute src="h" name= "page.h" value="TODO" />
    <component  id="component1" >
      <trace id="component3.trace1">
        <attribute src="h" name= "trace.h" value="TODO" />
        <locus x="371" y= "36" ellipse_x="371.269" ellipse_y="35.5983"
ellipse_major_radius= "14.3639" ellipse_minor_radius="9.81155"
ellipse_angle="0.148638" ellipse_major_axis= "0.988974 0.148091"
ellipse_minor_axis="0.148091 -0.988974" intensity="0" thickness="2"
color= "#(TODO)" KM2="1" KM4="3" KM8= "3" />
        <locus x="371" y= "37" ellipse_x="371.428" ellipse_y="36.853"
ellipse_major_radius= "14.3171" ellipse_minor_radius="9.86581"
ellipse_angle="0.327775" ellipse_major_axis= "0.946761 0.321938"
ellipse_minor_axis="0.321938 -0.946761" intensity="0" thickness="2"
color= "#(TODO)" KM2="1" KM4="3" KM8= "3" />
        <locus x="371" y= "38" ellipse_x="371.532" ellipse_y="38.2574"
ellipse_major_radius= "18.3574" ellipse_minor_radius="15.0037"
ellipse_angle="0.508344" ellipse_major_axis= "0.873552 0.486731"
ellipse_minor_axis="0.486731 -0.873552" intensity="0" thickness="1"
color= "#(TODO)" KM2="0" KM4="1" KM8= "3" />
        <locus x="371" y= "39" ellipse_x="371.482" ellipse_y="39.5204"
ellipse_major_radius= "17.479" ellipse_minor_radius="15.5356"
ellipse_angle="0.524238" ellipse_major_axis= "0.865705 0.500554"
ellipse_minor_axis="0.500554 -0.865705" intensity="0" thickness="3"
color= "#(TODO)" KM2="0" KM4="1" KM8= "3" />
         ...
         ...
         ...
        <locus x="350" y= "43" ellipse_x="350.593" ellipse_y="43.4193"
ellipse_major_radius= "30.7193" ellipse_minor_radius="25.6399"
ellipse_angle="2.10944" ellipse_major_axis= "-0.512976 0.858403"
ellipse_minor_axis="-0.858403 -0.512976" intensity="0" thickness="5"
color= "#(TODO)" KM2="0" KM4="2" KM8= "0" />
      </trace >
    </component >
  </page >
</document >


In order to convert it to SVG format:

<?xml version=' 1.0' encoding='UTF-8'?>
<?xml-stylesheet href="hvm_to_svg.css" type="text/css"? >
<svg height="506" width= "1012"
xmlns:xlink="http://www.w3.org/1999/xlink "
xmlns="http://www.w3.org/2000/svg ">
  <image height="506" width= "1012" xlink:href="foreground.png" />
  <path d="M371.269 35.5983 L371.428 36.853 L371.532 38.2574 L371.482
39.5204 .... L350.593 43.4193" class="trace"/ >
</svg >


(where .... is replaced by more "Lx y" components)


I am using the XSLT:
....
            <xsl:for-each select="component">
                <xsl:for-each select="trace">
                    <path >
                        <xsl:attribute name="class">
trace</xsl:attribute >
                        <xsl:attribute name="d">
                            <xsl:for-each select="locus[position()=1]">
                                <xsl:text >M </xsl:text >
                                <xsl:value-of select="@ellipse_x"/ >
                                <xsl:text > </xsl:text >
                                <xsl:value-of select="@ellipse_y"/ >
                            </xsl:for-each >
                            <xsl:for-each select="locus[position()!=1]">
                                <xsl:text > L</xsl:text >
                                <xsl:value-of select="@ellipse_x"/ >
                                <xsl:text > </xsl:text >
                                <xsl:value-of select="@ellipse_y"/ >
                            </xsl:for-each >
                        </xsl:attribute >
                    </path >
                </xsl:for-each >
            </xsl:for-each >
....

XSLT profiler shows that 80% of the time is spent in enumerating the
"locus" elements?


Is there a way to faster iteration of the "locus" elements?


Thanks
- Sujata

Current Thread