xsl-list
[Top] [All Lists]

RE: Keeping a map in my XSL

2005-09-13 10:43:21
Hi.

Kevin, I've done something like what you want to do using the document
function and xpaths.  I agree with Andrew's suggestion about not relying
on document order to associate key/value pairs, but we have values that
can contain elements so we use something more like:

<map>
   <key name="1">value of name 1</key>
   <key name="7">value of name 7</key>
</map>

That's in a separate file from the xsl (say map.xml).

Then in the xsl you can use:

<xsl:variable name="map" select="document('map.xml')"/>

To get then value for 1 you can use:

<xsl:value-of select="$map//key[(_at_)name='1']/>

Andrew would your xsl:key solution apply to this?  If so how?

---->Nathan

-----Original Message-----
From: andrew welch [mailto:andrew(_dot_)j(_dot_)welch(_at_)gmail(_dot_)com] 
Sent: Tuesday, September 13, 2005 9:02 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Keeping a map in my XSL

On 9/13/05, Kevin L. Cobb <kevin(_dot_)cobb(_at_)emergint(_dot_)com> wrote:
I want to be able to set a variable that is retreived from 
my XML I am
parsing to a mapped values. For example, lets say I have an 
XML map that
looks like this:

<map>
        <key>12345</key><value>abcde</key>
        <key>78910</key><value>lmnop</value>
</map>

My source XML has the value '12345' in a certain field. I 
retreive the
field as usual in XSL and then I want to get the mapped 
value of this
field. The map above is "included" in my XSL. Is there a 
best way to do
this in XSL?

yes, first restructure your map as associating a key and value by
position is a bad idea, much better to use attributes:

<map>
  <key name="12345" value="abcde"/>
  <key name="78910" value="lmnop"/>
</map>

then define a key to return a value for a given name:

<xsl:key name="mappings" match="key" use="@name"/>

then in xslt 1.0 use:

<xsl:variable name="lookup" select="the_name_you_want_lookup"/>
<xsl:for-each select="$map">
  <xsl:value-of select="key('mappings', $lookup)/@value"/>
</xsl:for-each>

in 2.0 you don't have the hassle of switching the context node because
key() can take it as the third argument:

  <xsl:value-of select="key('mappings', the_name_you_want_to_lookup,
$mappings)/@value"/>

cheers
andrew

--~------------------------------------------------------------------
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>
--~--



<Prev in Thread] Current Thread [Next in Thread>