|
Subject: [xsl] Writing a SELECT with each OPTION a unique value From: "Waters, Tyler S FOR:EX" <Tyler.Waters@xxxxxxxxx> Date: Tue, 10 Apr 2007 17:54:49 -0700 |
I'm fairly new to this whole XML/XSL(T) thing. I've got this XML file.
It's painfully basic, I'm sure you've seen it somewhere online:
<?xml version="1.0" encoding="ISO8859-1" ?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tylor</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
</CATALOG>
What I want to do is write a SELECT with each OPTION being a unique
value, in particular for this XML file: COUNTRY. As I see it, there's
two ways: using KEYs, using "preceding::" -- KEYs are far faster,
preceding is... well... arguably more straightforward. I'd like to use
KEYs, but I've run into a bit of a wall.
<xsl:key name="KEY_COUNTRY" match="CD" use="COUNTRY" />
-- indexes all the items based on country
<xsl:for-each select="key('KEY_COUNTRY', 'USA')">
<xsl:value-of select="." /><br/>
</xsl:for-each>
-- iterates though all items and spits out records where USA is the
country
<xsl:value-of select="key("KEY_COUNTRY", "USA")[1]" />
-- returns bob dylan's record
Is there any way to get a list of the values, e.g. USA, UK, etc... ?
kinda like using the "key" function but without the second parameter?
I ended up writing a template like such -- which would return me a
SELECT with a series of options, each being unique:
<xsl:call-template name="selectField">
<xsl:with-param name="currentNode" select="CATALOG/CD/COUNTRY"/>
<xsl:with-param name="name" select="'COUNTRY'"/>
</xsl:call-template>
<xsl:template name="selectField">
<xsl:param name="currentNode" select="."/>
<xsl:param name="name" select="."/>
<xsl:value-of select="$name"/>:
<select>
<option selected="SELECTED" value=""></option>
<xsl:for-each
select="$currentNode[not(.=preceding::*[local-name()=$name])]">
<option value="{.}"><xsl:value-of
select="."/></option>
</xsl:for-each>
</select>
</xsl:template>
But should I be kicking myself in the pants for using preceding?
Isn't it going to be painfully slow for my users when I get to actual
datasets?
Thanks in advance
-Tyler Waters
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Temporary Trees and Parse, David Carlisle | Thread | Re: [xsl] Writing a SELECT with eac, Mukul Gandhi |
| RE: [xsl] Temporary Trees and Parse, Mark Shellenberger | Date | Re: [xsl] Writing a SELECT with eac, Mukul Gandhi |
| Month |