xsl-list
[Top] [All Lists]

RE: [xsl] for-each-group usage

2007-03-07 08:34:48
saxon:evaluate() is always going to be expensive. In situations where you
are using the same expression repeatedly (e.g. to calculate a sort key or a
grouping key) it's well worth splitting it into its two halves,
saxon:expression and saxon:eval:

<xsl:variable name="sortkey"
select="saxon:expression(../data-set/order-by/@xpath)"/>

then

<xsl:sort select="saxon:eval($sortkey)"/>

Michael Kay
http://www.saxonica.com/

 

-----Original Message-----
From: Angela Williams 
[mailto:Angela(_dot_)Williams(_at_)the401kcompany(_dot_)com] 
Sent: 07 March 2007 15:19
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] for-each-group usage

That was it - thanks!

Is this stylesheet efficient or is there a better way of doing this?

-----Original Message-----
From: Michael Kay [mailto:mike(_at_)saxonica(_dot_)com]
Sent: Tuesday, March 06, 2007 5:47 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] for-each-group usage

The group-by and order-by expressions both need to be 
relative to the nodes being grouped. That is, you want the 
group-by expression to be "d"
rather
than "doc('one.xml')/a/b/d" You seem to have fixed this for 
the sort key (by using substring-after), but not for the grouping key.

Michael Kay
http://www.saxonica.com/


-----Original Message-----
From: Angela Williams 
[mailto:Angela(_dot_)Williams(_at_)the401kcompany(_dot_)com]
Sent: 06 March 2007 22:33
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] for-each-group usage

Hello!

I have a mistake in my XSLT 2.0 stylesheet below that is 
causing the 
grouping mechanism to not work properly. I've used for-each-group 
successfully in the past, but this is more complicated (or 
I am just 
making it more so).

Will someone please point out my error?
Also, is there a more elegant/efficient way of going about this?

I have two xml files. One.xml contains my data objects and two.xml 
defines a list of table columns and tells me which data to put in 
which column. I need to match on my table columns and 
inject the data 
at run time.

Desired output:
Seed Pod
Apple               E 
Orange      E

Root
Potato      E
Carrot      E

Actual output:
Seed Pod
Apple               E
Potato      E
Orange      E
Carrot      E

Root
Apple               E
Potato      E
Orange      E
Carrot      E

One.xml:
<a>
  <b>
    <c>Apple</c>
    <d>Seed Pod</d>
    <e> E </e>
  </b>
  <b>
    <c>Potato</c>
    <d>Root</d>
    <e> E </e>
  </b>
  <b>
    <c>Orange</c>
    <d>Seed Pod</d>
    <e> E </e>
  </b>
  <b>
    <c>Carrot</c>
    <d>Root</d>
    <e> E </e>
  </b>
</a>

Two.xml:
<table>
  <data-set>  
    <row-set xpath="doc('one.xml')/a/b"/>
    <group-by xpath="doc('one.xml')/a/b/d"/>
    <order-by xpath="doc('one.xml')/a/b/c"/>
  </data-set>
  <columns>
    <column>
      <data-value xpath="doc('one.xml')/a/b/c"/>
    </column>
    <column>
      <data-value xpath="doc('one.xml')/a/b/e"/>
    </column>
  </columns>
</table>

And my stylesheet (included in a master file - I can send that if
needed.):
<xsl:stylesheet xmlns:fo="http://www.w3.org/1999/XSL/Format"; 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
  xmlns:sax="http://saxon.sf.net/"; version="2.0">

  <xsl:template match="columns">
    <xsl:variable name="cols" select="." />

    <xsl:variable name="rows" as="xs:string">
      <xsl:value-of select="../data-set/row-set/@xpath" />
    </xsl:variable>

    <xsl:variable name="group" as="xs:string">
      <xsl:value-of select="../data-set/group-by/@xpath" />
    </xsl:variable>

    <xsl:variable name="sort" as="xs:string">
      <xsl:value-of select="../data-set/order-by/@xpath" />
    </xsl:variable>

    <xsl:for-each-group select="sax:evaluate($rows)" 
                        group-by="sax:evaluate($group)">
      <xsl:sort select="sax:evaluate(
                          substring-after($sort, concat($rows, '/'))
                        )" />
      <fo:table-row>
        <fo:table-cell>
          <fo:block>
            <xsl:value-of select="current-grouping-key()" />
          </fo:block>
        </fo:table-cell>
      </fo:table-row>
      <xsl:for-each select="current-group()">
        <xsl:variable name="node" select="." />
        <fo:table-row>
          <xsl:for-each select="$cols/column">
            <fo:table-cell column-number="{position()}">
              <fo:block>
                <xsl:variable name="field">
                  <xsl:value-of select="data-value/@xpath" />
                </xsl:variable>
                
                <xsl:value-of 
                   select="$node/sax:evaluate(
                             substring-after($field, concat($rows, 
'/'))
                          )" />
              </fo:block>
            </fo:table-cell>
          </xsl:for-each>
        </fo:table-row>
      </xsl:for-each>
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

Thanks!
Angela Williams
Angela(_dot_)Williams(_at_)the401kcompany(_dot_)com
Austin, TX



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



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



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



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