xsl-list
[Top] [All Lists]

Re: Controlling tabular layout of a nodeset

2003-07-25 11:29:27
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(_dot_)Marshall(_at_)accurate(_dot_)co(_dot_)uk>
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(_at_)accuratesoftware(_dot_)com
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(_at_)accuratesoftware(_dot_)com 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



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