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(_at_)innodata-isogen(_dot_)com]
Sent: 20 June 2007 19:15
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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(_at_)innodata-isogen(_dot_)com
www.innodata-isogen.com
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--