Subject: [xsl] lookup table (was: mixed content nodes question) From: Kevin Rodgers <kevin.rodgers@xxxxxxx> Date: Fri, 7 Jan 2005 15:44:44 -0700 |
Michael Kay writes: > > > Or to one who doesn't like if's > > > > > ><xsl:template match="dictionary[lookup = '3']>Foo<xsl:/template> > > ><xsl:template match="dictionary[lookup = '4']>Foo<xsl:/template> > > My preferred way to do lookups is to make it table driven: > > <xsl:variable name="table"> > <entry code="3" value="foo"/> > <entry code="4" value="bar"/> > </xsl:variable> > > <xsl:template match="dictionary"> > <xsl:value-of select="$table/entry[@code=current()/@lookup]/@value"/> > </xsl:template> I'm a novice working on my first stylesheet, which has a lookup table that I implemented like this: <xsl:template name="convert-language"> <xsl:param name="code">en</xsl:param> <!-- See ISO 639 --> <xsl:choose> <xsl:when test="$code = 'ar'">ARABIC</xsl:when> <xsl:when test="$code = 'de'">GERMAN</xsl:when> <xsl:when test="$code = 'es'">SPANISH</xsl:when> ... <xsl:otherwise> <xsl:message terminate="no">Unrecognized language code: <xsl:value-of select="$code"/></xsl:message> <xsl:value-of select="$code"/> </xsl:otherwise> </xsl:choose> </xsl:template> That is accessed like this: <xsl:call-template name="convert-language"> <xsl:with-param name="code" select="stringmb3e:doc_lang_list/mb3e:doc_lang[1]"/> </xsl:call-template> Then I came across an element that had no mb3e:doc_lang_list child and thus no mb3e:doc_lang grandchildren, which generated the "Unrecognized language code" message (with no value for the allegedly erroneous code). So I added this instruction before <xsl:otherwise> to simply return an empty string in that case: <xsl:when test="$code = ''"></xsl:when> I was surprised that (under Xalan 2.6.0) that didn't solve the problem -- I still got the error message. I got the desired behavior by changing the call to this: <xsl:call-template name="convert-language"> <xsl:with-param name="code" select="string(mb3e:doc_lang_list/mb3e:doc_lang[1])"/> </xsl:call-template> But I obviously have a fundamental misunderstanding: I know that the select expression in the original call returns a node-set, which the XSLT processor apparently converts automatically to a string when evaluating the test expression (as desired, since I get the intended language names in my output). So why doesn't the empty node-set match the empty string test (i.e. why do I have to explicitly convert it before calling the lookup template)? > Needs the xx:node-set() extension or the document("") cheat if using XSLT > 1.0. I'd rather learn the ropes and get an XSLT 1.0 prototype working before delving into XSLT 2.0. What are the advantages of your implementation, and what are the xx:node-set() extension and the document("") cheat? Thanks, -- Kevin Rodgers
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] mixed content nodes quest, Mark Lundquist | Thread | RE: [xsl] lookup table (was: mixed , Michael Kay |
Re: [xsl] mixed content nodes quest, Wendell Piez | Date | RE: [xsl] lookup table (was: mixed , Michael Kay |
Month |