| Subject: Re: [xsl] How to display more complicated xml document by xsl (again)? From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Thu, 7 Mar 2002 10:02:15 +0000 | 
Hi Sjoy,
> This time I want to display the Keyword in order. First line(tr/td)
> will display 'group1', second line display the Keyword 3 only, and
> the last line display 'group2'.
I think that the easiest way to do this is to apply templates to all
the Keyword elements, and work out what to do with them on a case by
case basis. There are three categories that the Keywords could fall
into:
  - first in a group - output group number
  - elsewhere in a group - output nothing
  - not in a group - output keyword
You need a quick way of working out whether a particular keyword is
part of a group; you can do that with a key that indexes the Group
elements by the values of their Member elements:
<xsl:key name="groups" match="Group" use="Member" />
This way, if you do:
  key('groups', 2)
You'll get back the group that has Keyword 2 as a member.
Then you need to iterate over each Keyword:
  <xsl:for-each select="/root/Keywords/Keyword">
    ...
  </xsl:for-each>
You can locate the group that contains the keyword using the key with
the Keyword's id:
  <xsl:for-each select="/root/Keywords/Keyword">
    <xsl:variable name="group" select="key('groups', @id)" />
    ...
  </xsl:for-each>
Then you can choose what to do on the basis of $group. If there isn't
a group, then you want to output the keyword details:
  <xsl:for-each select="/root/Keywords/Keyword">
    <xsl:variable name="group" select="key('groups', @id)" />
    <xsl:choose>
      <xsl:when test="not($group)">
        <xsl:value-of select="." />
      </xsl:when>
      ...
    </xsl:choose>
  </xsl:for-each>
If the id of the Keyword you're looking at is the same as the value of
the first Member within the group, then you want to output the group
name:
  <xsl:for-each select="/root/Keywords/Keyword">
    <xsl:variable name="group" select="key('groups', @id)" />
    <xsl:choose>
      <xsl:when test="not($group)">
        <xsl:value-of select="." />
      </xsl:when>
      <xsl:when test="@id = $group/Member[1]">
        <xsl:value-of select="$group/@name" />
      </xsl:when>
    </xsl:choose>
  </xsl:for-each>
And that's it (otherwise you do nothing; you could have an empty
xsl:otherwise element, but there's no need).
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| [xsl] How to display more complicat, shenjun | Thread | [xsl] apply templates to the nth re, Lea Allison | 
| Re: [xsl] XPath perfomance in attri, Jonathan Perret | Date | Re: [xsl] word wrap in a text strin, Jeni Tennison | 
| Month |