Subject: RE: [xsl] Looking Not Working for No Obvious Reason From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 20 Jun 2007 19:47:54 +0100 |
Can't see anything wrong with the code, I think you need to supply a reproducible case where it doesn't work. Your xsl:choose could be replaced by the rather more concise: <xsl:sequence select="($sectionTitleMap/map/item[longtitle = $sectionBaseTitle]/shorttitle, $sectionBaseTitle)[1]"/> and if the lookup list is lengthy you could improve performance using keys (though Saxon-SA will do this for you automatically). Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Eliot Kimber [mailto:ekimber@xxxxxxxxxxxxxxxxxxx] > Sent: 20 June 2007 19:15 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Looking Not Working for No Obvious Reason > > Within my style sheet I need to be able to map between pairs > of strings (in this case, long and short titles). > > I've tried to implement this by using an internal > document-node() variable that defines the mapping and then > using a function to do lookups against the map. > > The map looks like this (declared as a stylesheet-scope variable): > > <xsl:variable name="sectionTitleMap" as="document-node()"> > <xsl:document> > <map> > <item> > <shorttitle>Background</shorttitle> > <longtitle>Overview and Background</longtitle> > </item> > <item> > <shorttitle>Scope</shorttitle> > <longtitle>Scope and Scope Exceptions</longtitle> > </item> > <item> > <shorttitle>Glossary</shorttitle> > <longtitle>Topical Definitions - Glossary</longtitle> > </item> > </map> > </xsl:document> > <xsl:variable> > > I then have this function to do lookups: > > <xsl:function > name="func:getShortTitleForSection" as="xs:string"> > <xsl:param > as="xs:string" > name="sectionBaseTitle"/> > <xsl:choose> > <xsl:when test="count($sectionTitleMap//longtitle[. = > $sectionBaseTitle]) = 1"> > <xsl:sequence > select="$sectionTitleMap//item[longtitle[. = > $sectionBaseTitle]]/shorttitle"/> > </xsl:when> > <xsl:otherwise> > <xsl:sequence select="$sectionBaseTitle"/> > </xsl:otherwise> > </xsl:choose> > > </xsl:function> > > > As far as I can see this should just work, assuming my input > parameter occurs in the table. > > However, what I'm getting is that this works as expected for > *some* input strings but not for others, where I've verified > that the input strings match the values in the map. > > I must be doing something wrong but I can't figure out what > it might be--the fact that some input values work and others > don't is odd. > > Anyone have any idea what might be going wrong or what I can > do to track down the bug? I've done things like copied a > mapping target from my input document into the map just to be > 100% sure the string is the same, but I still get the > failure, so it doesn't appear to be something subtle like > invisible characters in the input or some such (which I > wouldn't expect in this case, but you never know). > > The real mapping is small enough I could rewrite the code to > use choose/when for the mappings but this seemed like the > most efficient way to do a two-way mapping in XSLT. > > Thanks, > > Eliot > > -- > W. Eliot Kimber > Professional Services > Innodata Isogen > 8500 N. Mopac, Suite 402 > Austin, TX 78759 > (214) 954-5198 > > ekimber@xxxxxxxxxxxxxxxxxxx > www.innodata-isogen.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Looking Not Working for N, Eliot Kimber | Thread | [xsl] Splitting Data into Two Sets,, Daniel Johnson |
Re: [xsl] Looking Not Working for N, David Carlisle | Date | Re: [xsl] Looking Not Working for N, Eliot Kimber |
Month |