xsl-list
[Top] [All Lists]

RE: [xsl] for-each-group usage

2007-03-07 08:19:42
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>
--~--

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