xsl-list
[Top] [All Lists]

RE: Merging attribute values to unique list

2003-08-01 17:50:21
Hi


-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
James Cummings
Sent: Friday, August 01, 2003 12:17 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Merging attribute values to unique list



Hi there,

This is similar to something I asked months ago, and you'd 
think I'd be able to figure it out but... assuming you have a 
file like>


<foo id="a1">
<body wit="A B E D">some stuff</body>
<body wit="C A G">some other stuff</body>
</foo>

What I want to produce is a list of links one for each unique 
witness, so in this case something like:

<p>See the reading for:
<a href="foo/a1.xml?wit="A">A</a>
<a href="foo/a1.xml?wit="B">B</a>
<a href="foo/a1.xml?wit="C">C</a>
<a href="foo/a1.xml?wit="D">D</a>
<a href="foo/a1.xml?wit="E">E</a>
<a href="foo/a1.xml?wit="G">G</a>
</p>

So, I'm assuming what needs to happen is that I need to 
somehow produce a list of each of the tokenized contents of 
//body/@wit which are then sorted and made unique. Any 
suggestions on how to go about this using Xalan inside 
cocoon-2.1?  I.e. I have some ideas on how to do it with 
saxon extensions/xslt 2.0, but not inside cocoon.  Any 
suggestions appreciated!



Try this, in saxon or xalan you can define fn to "http://exslt.org/common":

  <xsl:key match="wit" name="wits" use="@name"/>
  <xsl:template match="foo">
    <xsl:variable name="wits">
      <root>
        <xsl:apply-templates mode="wits"/>
      </root>
    </xsl:variable>
    <xsl:apply-templates select="fn:node-set($wits)"/>
  </xsl:template>
  <xsl:template match="root">
    <p>
      <xsl:text>See the reading for:&#10;</xsl:text>
      <xsl:apply-templates
select="wit[generate-id()=generate-id(key('wits',@name))]">
        <xsl:sort select="@name"/>
      </xsl:apply-templates>
    </p>
  </xsl:template>
  <xsl:template match="wit">
    <a href="foo/a1(_dot_)xml?wit={(_at_)name}">
      <xsl:value-of select="@name"/>
    </a>
    <xsl:text>&#10;</xsl:text>
  </xsl:template>
  <xsl:template match="body" mode="wits">
    <xsl:call-template name="wits"/>
  </xsl:template>
  <xsl:template name="wits">
    <xsl:param name="str" select="@wit"/>
    <xsl:choose>
      <xsl:when test="contains($str,' ')">
        <wit name="{substring-before($str,' ')}"/>
        <xsl:call-template name="wits">
          <xsl:with-param name="str" select="substring-after($str,' ')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <wit name="{$str}"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

Regards,
Americo Albuquerque


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