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: </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> </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