Re: [xsl] Controlling tabular layout of a nodeset

Subject: Re: [xsl] Controlling tabular layout of a nodeset
From: Mukul Gandhi <mukulw3@xxxxxxxxx>
Date: Fri, 25 Jul 2003 11:29:27 -0700 (PDT)
Hi John,
  i have assumed the following XML. Hope your XML is
similar to this.

<?xml version="1.0" encoding="UTF-8"?>
<recordset>
  <record>
    <property>property2</property>
    <prvalue>prvalue2</prvalue>
    <user_id>user_id4</user_id>
    <acct_id>acct_id6</acct_id>
  </record>
  <record>
    <property>property1</property>
    <prvalue>prvalue1</prvalue>
    <user_id>user_id1</user_id>
    <acct_id>acct_id1</acct_id>
  </record>
  <record>
    <property>property2</property>
    <prvalue>prvalue2</prvalue>
    <user_id>user_id3</user_id>
    <acct_id>acct_id3</acct_id>
  </record>
  <record>
    <property>property1</property>
    <prvalue>prvalue1</prvalue>
    <user_id>user_id1</user_id>
    <acct_id>acct_id2</acct_id>
  </record>
  <record>
    <property>property2</property>
    <prvalue>prvalue2</prvalue>
    <user_id>user_id4</user_id>
    <acct_id>acct_id5</acct_id>
  </record>
  <record>
    <property>property1</property>
    <prvalue>prvalue1</prvalue>
    <user_id>user_id2</user_id>
    <acct_id>acct_id1</acct_id>
  </record>
  <record>
    <property>property2</property>
    <prvalue>prvalue2</prvalue>
    <user_id>user_id3</user_id>
    <acct_id>acct_id4</acct_id>
  </record>
</recordset>

The complete XSL is
-------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 <xsl:output method="xml" version="1.0"
encoding="UTF-8" indent="yes"/>
 <xsl:key name="x" match="recordset/record"
use="property"/>
 <xsl:key name="y" match="recordset/record"
use="concat(property,':',user_id)"/>

 <xsl:template match="recordset">
   <html>
     <head>
	<title>Grouping</title>
     </head>
     <body>
       <table border="1">
	<xsl:apply-templates select="record"/>
       </table>
     </body>
   </html>
 </xsl:template>
 
 <xsl:template match="record">
   <xsl:if test="generate-id(.) =
generate-id(key('x',property)[1])">
   <xsl:for-each select="key('x',property)">
     <xsl:if test="position() = 1">
       <tr>
	<td>
  	 <xsl:value-of select="property"/>
 	</td>
	<td>
	- <xsl:value-of select="prvalue"/>
	</td>
      </tr>
    </xsl:if>
    <xsl:if test="generate-id(.)=generate-id(key('y',
concat(property,':',user_id))[1])">
      <xsl:for-each
select="key('y',concat(property,':',user_id))">
        <xsl:if test="position() = 1">
	<tr>
	 <td>
	  <xsl:value-of select="user_id"/>
	 </td>
	 <td>
	   <xsl:for-each select="key('y',
concat(property,':',user_id))">				   <xsl:value-of
select="acct_id"/>
	<xsl:if test="position()!=last()">,</xsl:if>
	</xsl:for-each>
	</td>
    </tr>				
  </xsl:if>
  </xsl:for-each>
 </xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:template>

</xsl:stylesheet>

We need to use composite keys as suggested by
J.Pietschmann. 

Hope the above XSL would solve your problem.

Regards,
Mukul


--- John Marshall <John.Marshall@xxxxxxxxxxxxxx>
wrote:
> I am using Xalan-j_2_5_1. I have a set of elements
> (recovered by SQL), each containing four child
> elements: property, prvalue, user_id and acct_id. I
> can use the Muench method to obtain a nodeset
> containing all elements with a particular value of
> "property". I can sort this into the required order.
> Using a for-each loop I can display this in a table
> as:
> 
> +---------+--------+--------+--------+
> |property1|prvalue1|user_id1|acct_id1|
> +---------+--------+--------+--------+
> |property1|prvalue1|user_id1|acct_id2|
> +---------+--------+--------+--------+
> |property1|prvalue1|user_id2|acct_id1|
> +---------+--------+--------+--------+
> 
> I want to display it as:
> +--------+------------------+
> |property1 - prvalue1       |
> +--------+------------------+
> |user_id1|acct_id1, acct_id2|
> +--------+------------------+
> |user_id2|acct_id1 ...      |
> +--------+------------------+
> 
> In order to do this I need to either access the
> element in my nodeset before "." or store the values
> of prvalue and user_id from one iteration to access
> in the next iteration, to do the appropriate format
> control.
> 
> I can get the result I need by successively
> searching the source tree, but the length of this
> table makes this unacceptably slow (4 1/2 hours).
> 
> I had hoped that EXSLT set:leading() would provide a
> solution, but I note that the documentation shows
> this returns a node set in document order, not in
> the order of the sorted subset I have obtained, so I
> have not pursued this.
> 
> This seems such a common requirement that I am sure
> there is a straightforward answer and I apologise if
> I have missed it.
> 
> Thank you.
> 
> John Marshall
> Accurate Software
> 
> 80 Peach Street, Wokingham, Berkshire, RG40 1XH, UK.
> Tel: +44 (0)118 977 3889
> Fax: +44 (0)118 977 1260
> http://www.accuratesoftware.com 
> 
> 
> Accurate Software
> 
> info@xxxxxxxxxxxxxxxxxxxx
> www.accuratesoftware.com
> 
> Europe . North America . Australasia . Africa
> 
> The information in this email is confidential and
> privileged and is intended only for the use of the
> individual or entity listed above.  If you are
> neither the intended individual, or entity listed
> above, nor the person responsible for the delivery
> of this email to the intended recipients, you are
> hereby notified that any unauthorised distribution,
> copying or use of this email is prohibited. If you
> have received this email in error, please notify the
> Accurate system manager at
> postmaster@xxxxxxxxxxxxxxxxxxxx or on +44 (0)118 977
> 3889.  The views expressed in this communication may
> not necessarily be the views held by the Accurate
> Group.
> 
> 
>  XSL-List info and archive: 
> http://www.mulberrytech.com/xsl/xsl-list
> 


__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com

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


Current Thread