xsl-list
[Top] [All Lists]

RE: [xsl] Looking Not Working for No Obvious Reason

2007-06-20 11:48:22
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>
--~--