xsl-list
[Top] [All Lists]

[xsl] Confusion about xsl:param and key()

2006-03-27 16:24:39
 
Hello.
 
I am trying to create a stylesheet that will process my data (see below for
sample) to produce an SVG bar chart of mean values of some attribute. The
data ends up being grouped to generate the classes of the bar chart. For
example, I may want to group based on <spcd>, and plot the mean tree <ht>
for each <spcd>.  I have created a stylesheet that can do this, but its a
static stylesheet - I have hardcoded in <spcd> and <ht>. I was hoping to
make the stylesheet more dynamic by adding stylesheet parameters for the
grouping variable and for the attribute of interest, but so far that has
failed. I have tried to set up a grouping parameter and passing in a value
for that parameter but the graph does not look at all like the hard-coded
version. Instead of producing bars for each <spcd> group, bars are produced
for each <tree> element.
 
Here is a code sample. You can see some of the many places that I have
hardcoded in the value 'spcd'. I want to end my dependence on hard coding in
the values and use parameter values instead. How do I do that? xslt version
is 2.0 and processor is saxon 8.7.
 
Small sample of XML

<row>
  <data>         
    <tree>
       <vol>66.111838</vol>
       <ht>97</ht>
       <dia>18.80</dia>
       <spgrpcd>10</spgrpcd>
       <spcd>202</spcd>
       <fortypcd>22</fortypcd>
       <owngrpcd>12<owngrpcd>
    </tree>
    <tree>
       <vol>46.201</vol>
       <ht>67</ht>
       <dia>8.67</dia>
       <spgrpcd>20</spgrpcd>
       <spcd>11</spcd>
       <fortypcd>22</fortypcd>
       <owngrpcd>12<owngrpcd>
    </tree>
  </data>
 </row>

<xsl:stylesheet version="2.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
 xmlns:exsl_common="http://exslt.org/common";
 xmlns:exsl_math="http://exslt.org/math";
 xmlns:xs="http://www.w3.org/2001/XMLSchema";
 xmlns:saxon="http://saxon.sf.net/";
 extension-element-prefixes="exsl_math exsl_common">
 
 <xsl:output omit-xml-declaration="no" standalone="yes" indent="yes"
method="xml"/>
 
 <xsl:param name="groupBy" select="'spcd'" as="xs:string" />
 
 <!-- kept this 'spcd' hardcoded but want to 'parameterize' it as well -->
 <xsl:key name="speciesCodes" match="//row/data/tree" use="spcd" />
 <xsl:variable name="width" select="1000" />
 <xsl:variable name="height" select="1000" />
 
 <xsl:variable name="pathToTrees" select="//row/data/tree" />
 
 <xsl:template match="/">
  <svg xmlns:svg="http://www.w3.org/2000/svg";
   xmlns:xlink="http://www.w3.org/1999/xlink";
   xmlns:a3="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/";
   onload="init(evt)"
   viewBox="0 0 {$width} {$height}">
    <g id="container">
     <!-- Draw outline of graph -->
     <rect x="0" y="0" width="{$width}" height="{$height}"
style="stroke:#a0a0a0;fill:white;stroke-                        width:0.5"
onclick="addRect(evt)"></rect>

        <!-- This is here for testing purposes but demonstrates the problem.
If I use the literal 'spcd',            I get a list of the seven unique
<spcd> in my data. If I use the variable $groupBy, I get
        a list of all the individual trees -->     
 
        <!-- This produces a list of seven unique <spcd>'s
        <xsl:for-each select="$pathToTrees[count(. | key('speciesCodes',
spcd)[1]) = 1]">
          <text x="200" y="{11 * position()}"><xsl:value-of select="spcd"
/></text>
        </xsl:for-each>
    
        <!-- This produces a list of text values 'spcd'; one for each tree -
all 500 of them
        <xsl:for-each select="$pathToTrees[count(. | key('speciesCodes',
$groupBy)[1]) = 1]">
          <text x="200" y="{11 * position()}"><xsl:value-of
select="$groupBy" /></text>
        </xsl:for-each>
    </g>
  </svg>
 </xsl:template>
</xsl:stylesheet>
 
Thank you for any help.

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

<Prev in Thread] Current Thread [Next in Thread>