xsl-list
[Top] [All Lists]

RE: [xsl] using str:tokenize named template results

2008-03-28 14:29:32
You're forgetting that a path expression starting with "/" or "//" selects
within the document that contains the context node - which in this case is
the document constructed by the str:tokenize template. You need to create a
global variable say <xsl:variable name="root" select="/"/> and then select
relative to that: select="$root//city[text() = $ns/token/text()]".

Or better, 

$root//city[. = $ns/token]"

You don't want to access the text nodes explicitly because comments or
processing instructions would stop your code working.

Michael Kay
http://www.saxonica.com/ 

-----Original Message-----
From: vwiswell [mailto:vwiswell(_at_)verizon(_dot_)net] 
Sent: 28 March 2008 19:59
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] using str:tokenize named template results

The str:tokenize template works beautifully (I am required to 
use xslt 1.0). I am using it to split the input from a 
multiple select box submitted from an html page thusly:

       <xsl:variable name="inValues">
         <xsl:call-template name="str:tokenize">
            <xsl:with-param name="string" select="$input" />
         </xsl:call-template>
      </xsl:variable>

I want to loop through the tokens checking for matches in my 
main input, an xml file. So I need nested for-each loops, the 
outer one looping through my tokens from str:tokenize and the 
inner one looping through <city>s in my doc.

The xml looks like this:

<sites>
   <site>
     <city>A City</city>
     <institution>Axxxxx Univ.</institution>
     <administers>to any student</administers>
     <schedule>2 times per month</schedule>
     <additional_costs>$15 admin. fee</additional_costs>
     <contact_information>(123) 123-1234</contact_information>
   </site>
   <site>
     <city>B City</city>
     <institution>Bxxxx College</institution>
     <administers/>
     <schedule/>
     <additional_costs/>
     <contact_information/>
   </site>
   <site>
     <city>C City</city>
     <institution>Cxxxxx College</institution>
     <administers>to any student</administers>
     <schedule>1 time per month</schedule>
     <additional_costs>$10 refundable deposit</additional_costs>
     <contact_information>(123) 123-1234</contact_information>
   </site>
   ...
</sites>

I'm not getting any output, so I think I have context issues, 
but I'm not sure how to fix it. I don't really understand the 
relationship between the str:tokenize results and my xml doc. 
It seems analogous to multiple input xml docs, but I'm not 
sure how to code it. This is what I have tried:

<xsl:template name="buildTable">
   <xsl:param name="tokens"/>
   <xsl:variable name="ns" select="msxsl:node-set($tokens)"/>
   <xsl:for-each select="$ns/token">
     <xsl:value-of select="text()" /><br /><!-- this works 
and proves the tokens are as expected -->
        <xsl:for-each select="//city[text() = $ns/token/text()]">
         <xsl:sort select="city"/>
         <xsl:value-of select="text()" /><br /><!-- this 
produces no output -->
      </xsl:for-each>
   </xsl:for-each>
</xsl:template>

If I remove the token (outer) for-each, I get output, but 
only for the first token (obviously). The tokens get passed 
to this template just fine.

I'd really appreciate a nudge in the right direction. Thanks.
  

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