RE: [xsl] Assistance with for-each

Subject: RE: [xsl] Assistance with for-each
From: cknell@xxxxxxxxxx
Date: Wed, 04 Jul 2007 16:59:57 -0400
The poor design of the input is the first thing that jumps out at me.

If <perscat> and <trade> are truly properties of <person>, then this structure is much easier to understand and work with:

<person man="1">
  <perscat category="Cook"/>
  <trade>McDonalds Chef</trade>
</person>

But I'll assume that you have no control over the input and work from there.

I'll start by saying that you don't need (an ought not use) for-each here. You need only create a template for <person> and apply-templates:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:output method="html" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
  
  <xsl:template match="reqpers">
    <table>
      <xsl:apply-templates select="person" />
    </table>
  </xsl:template>
    
  <xsl:template match="person">
    <tr>
      <td><xsl:value-of select="@man"/></td>
      <td><xsl:value-of select="following-sibling::perscat[1]/@category"/></td>
      <td><xsl:value-of select="following-sibling::trade[1]"/></td>
    </tr>
  </xsl:template>

</xsl:stylesheet>
-- 
Charles Knell
cknell@xxxxxxxxxx - email



-----Original Message-----
From:     Maxine Pensyl-Johnson <Maxine.Pensyl-Johnson@xxxxxxx>
Sent:     Wed, 4 Jul 2007 12:52:29 -0700
To:       <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Subject:  [xsl] Assistance with for-each

I'm trying to get my sample data to all appear on one table row, but I'm
unsuccessful. Any help you can provide is appreciated.


XSLT 1.0   SAXON 6.5.5

Sample Data:
                <reqpers>

                    <person man="1"/>

                    <perscat category="Cook"/>

                    <trade>McDonalds Chef</trade>

                    <person man="1"/>

                    <perscat category="Staff"/>

                    <trade>Front Counter</trade>

                    <person man="4"/>

                    <perscat category="Janitor"/>

                    <trade>Clean up the mess left by others</trade>

                </reqpers>

 

Desired Results

1	 Cook	 McDonalds Chef
1	 Staff	 Front Counter
4	 Janitor Clean up the mess left by others
  

Code:

        <xsl:for-each
select="reqpers/person|reqpers/perscat|reqpers/trade">

            <tr>

                <td valign="top"><xsl:value-of
select="person/@man"/></td>

                <td valign="top"><xsl:value-of
select="perscat/@category"/></td>

               <td valign="top"><xsl:value-of
select="trade/text()"/></td>

            </tr>

        </xsl:for-each>

Current Thread