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 |