xsl-list
[Top] [All Lists]

Re: Text Table with sorting

2003-09-25 09:39:33
Hi Ryan,

I have accomplished this by first figuring out what column has the
most entries (in the example below this would be maritalStatus).
Then I do a for-each on that column, and print out each entry by
indexing the three node-sets. The problem is, since I am doing only
one for-each loop I can't seem to sort multiple columns.

This is a tough problem. To be honest, I'd approach it using two
steps: one to do the sorting and the other to arrange the columns. In
other words, create an intermediate representation like:

<person>
    <maritalStatus refDate="1997-01-15">marriage</maritalStatus>
    <religion refDate="1996-12-02">Lutheran</religion>
    <maritalStatus refDate="1993-06-24">divorce</maritalStatus>
    <maritalStatus refDate="1989-04-11">marriage</maritalStatus>
    <religion refDate="1968-04-05">Roman Catholic</religion>
    <dateOfBirth>1968-04-05</dateOfBirth>
</person>

(which is simply a matter of sorting by @refDate), and then to your
desired output, using your current method of indexing into the three
node-sets of <maritalStatus>, <religion> and <dateOfBirth> elements.

An alternative, one-pass solution, is to use a template to get the
element in a particular (sorted) position; something like:

<xsl:template name="get-item-in-sorted-list">
  <xsl:param name="list" select="/.." />
  <xsl:param name="index" />
  <xsl:for-each select="$list">
    <xsl:sort select="@refDate" />
    <xsl:if test="position() = $index">
      <xsl:apply-templates select="." />
    </xsl:if>
  </xsl:for-each>
</xsl:template>

Then, rather than:

    <xsl:call-template name="print-entry">
       <xsl:with-param name="entry" select="$left[ $for-each-pos ]"/>
    </xsl:call-template>

use something like:

  <xsl:call-template name="print-entry">
    <xsl:with-param name="entry">
      <xsl:call-template name="get-item-in-sorted-list">
        <xsl:with-param name="list" select="$left" />
        <xsl:with-param name="index" select="$for-each-pos" />
      </xsl:call-template>
    </xsl:with-param>
  </xsl:call-template>

By the way, if you can switch to XSLT 2.0 (using Saxon 7.6.5), this
becomes a lot easier...

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



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