[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Text Table with sorting

Subject: Text Table with sorting
From: Ryan Sawatzky <rsawatzky@xxxxxxxxxxx>
Date: Thu, 25 Sep 2003 10:13:05 -0500
xsl text table
Hi,

I am trying to generate a style sheet that will generate text output. The output must be formatted in a text table. I have been able to generate the table for most elements, but there is a set of three elements that must appear on the same row, and they must be sorted by the refDate attribute. Because this is output as text, I must print the table line by line, instead of column by column.

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. Here is an example...

XML----

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

Output----
Marital Status Date of Birth Religion
marriage (1997-01-15) 1968-04-05 Lutheran (1996-12-02)
divorce (1993-06-24) Roman Catholic (1968-04-05)
marriage (1989-04-11)


So my style sheet right now looks something like this...

I first figure out what column has the most elements, in this case the left column so I say...
<xsl:for-each select="$left">
<xsl:variable name="for-each-pos" select="position()" />


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

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

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

   <xsl:text>&#10;</xsl:text>
</xsl:for-each>

The parameters left, middle, and right are node-sets of all the person/maritalStatus, person/dateOfBirth, and person/religion elements, respectively.

I can't figure out how to sort the right column when I am doing a for-each on the left column. Does anyone know how I could do that? Can I fit a <xsl:sort> into my currect structure somehow, or would I need to redo how I print the tables? It seems as though I would have to sort the right column node-set before I enter the for-each loop, but I don't know that is possible in XSLT, because <xsl:sort> doesn't actually sort the set, it just traverses the set in a sorted order, right? Any help is greatly appreciated.

Thanks
--Ryan




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



Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.