[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] applying templates out of a for-each


Subject: RE: [xsl] applying templates out of a for-each
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 29 May 2009 19:59:07 +0100

xsl:for-each changes the context. If you want to use the original context
within the for-each, you need to first bind it to a variable, for example:

  <xsl:variable name="this" select="."/>
  <xsl:for-each select="....">
     <xsl:apply-templates select="$this/(//*[name()=...])"/>

Regards,

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

> -----Original Message-----
> From: Detlef Heyn [mailto:detlef.heyn@xxxxxxxxx] 
> Sent: 29 May 2009 19:29
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] applying templates out of a for-each
> 
> Hi my dear experts
> 
> 
> I would appreciate your help with a problem i have.
> 
>  From a xml file i read the content of an element wich i 
> interpret in many possible ways for it's a config file for my 
> stylesheet.
> 
> This info i give to a template as a parameter simply called "input".
> 
> One way i interpret the value is as an element name wich 
> content i want to select.
> 
> This works fine until i use the following code:
> 
> ==================================================
> <config-input>show_element:Elementname</config-input>
> =========================
> <xsl:template name="select">
>   <xsl:param name="input"/>
>   <xsl:choose>
>    ...
>    <!-- show element -->
>    <xsl:when test="contains($input,'show_element:')">
> 
>     <xsl:apply-templates select="//node()[name() = 
> substring-after($input,':')]" mode="pure"/>
> 
>    </xsl:when>
>     ...
>   </xsl:choose>
> </xsl:template>
> =========================
> 
> but if i want to apply more than one element-content with the 
> help of a for-each over the readed config-input (wich im 
> tokenizing to seperate the certain element names) i get this error:
> 
> "F[Saxon-B 9.0.0.6]Cannot select a node here: the context 
> item is an atomic value
> URL: http://www.w3.org/TR/xpath20/#ERRXPTY0020"
> 
> ==================================================
> <config-input>show_element:Elementname1 
> Elementname2</config-input> ========================= 
> <xsl:template name="select">
>   <xsl:param name="input"/>
>   <xsl:choose>
>    ...
>    <!-- show element -->
>    <xsl:when test="contains($input,'show_element:')">
>     <xsl:for-each select="tokenize(substring-after($input,':'),' ')">
>      <xsl:variable name="temp_name" select="string(.)"/>
>      <xsl:apply-templates select="//node()[name() = $temp_name]" 
> mode="pure"/>
>     </xsl:for-each>
>    </xsl:when>
>     ...
>   </xsl:choose>
> </xsl:template>
> =========================
> 
> I understand that Saxon has a problem with applying templates 
> inside of a for-each-loop wich is all about selecting atomic 
> values (strings in this case)
> 
> 
> * Do I guess right or don't i catch the real cause?
> 
> * And how, if possible, do i get it work as intented?
> (I'm afraid I've just overseen a simple thing)
> 
> 
> 
> Thanks a lot for your help in advance.
> 
> have a good time
> 
> D. Heyn


Current Thread
Keywords
xml