RE: [xsl] parameter use in XPath

Subject: RE: [xsl] parameter use in XPath
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Thu, 23 Oct 2003 00:07:24 +0100
In XSLT 1.0, patterns must not contain variable references.

In XSLT 2.0, you can write

<xsl:template match="*[name()=$keyword]">

which I suspect is what you meant.

Michael Kay

> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Saverio Perugini
> Sent: 22 October 2003 23:44
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] parameter use in XPath
> 
> 
> Hello,
> 
> Is it possible to use the parameter "keyword" (line 1) in
> XPath expressions (lines 5, 13, and 27) in the following 
> stylesheet without the use of specific processor extensions?
> 
> I know one may not use variables set by the stylesheet in
> XPath expressions, but $keyword is passed from the command 
> line and thus not computed or set by the stylesheet.
> 
> Many thanks in advance,
> Saverio
> 
> --
> 
>  1:<xsl:param name="keyword"/>
> 
>  2:<xsl:template match="{$keyword}">
>  3:   <xsl:apply-templates/>
>  4:</xsl:template>
> 
> <!-- matches all nodes which have a descendant-or-self,
>      which is an ancestor-or-self::d and a leaf,
>      and does nothing with them -->
>  5:<xsl:template match="node()[not 
> (descendant-or-self::node()[ancestor-or-self::{$keyword} and 
> count (child::node()) = 0])]">
> 
>  6:  <xsl:variable name="original-node" select="."/>
>  7:  <xsl:variable name="original-node-name" select="name()"/>
>  8:  <xsl:variable name="original-node-id" select="@id"/>
> 
>    <!-- match a node who has a descendant with a refid 
> attribute, e.g., e -->
>  9:  <xsl:if test="descendant::node()[@refid]">
> 10:    <xsl:for-each select="descendant::node()[@refid]">
> 11:        <xsl:variable name="target-id" select="@refid"/>
> 12:         <xsl:variable name="target-node" 
> select="//node()[@id=$target-id]"/>
> 13:         <xsl:if 
> test="$target-node[descendant-or-self::node()[ancestor-or-self
> ::{$keyword} and count (child::node()) = 0]]">
> 
> 14:            <xsl:element name="{$original-node-name}">
> 15:               <xsl:attribute name="id">
> 16:                  <xsl:value-of select="$original-node-id"/>
> 17:               </xsl:attribute>
> 18:               <xsl:apply-templates select="$original-node/*"/>
> 19:            </xsl:element>
> 20:         </xsl:if>
> 21:      </xsl:for-each>
> 22:   </xsl:if>
> 23:</xsl:template>
> 
> <!-- matches all crosslinks and -->
> 24:<xsl:template match="node()[@refid]" priority="0.7">
> 25:   <xsl:variable name="target-id" select="@refid"/>
> 26:   <xsl:variable name="target-node" 
> select="//node()[@id=$target-id]"/>
> 
>    <!-- only copies those which have a descendant-or-self,
>         which has a reference to a node,
>         which is an ancestor-or-self::d and a leaf -->
> 27:   <xsl:if 
> test="$target-node[descendant-or-self::node()[ancestor-or-self
> ::{$keyword} and count (child::node()) = 0]]">
> 28:      <xsl:copy>
> 29:         <xsl:attribute name="refid">
> 30:            <xsl:value-of select="$target-id"/>
> 31:         </xsl:attribute>
> 32:      </xsl:copy>
> 33:   </xsl:if>
> 34:</xsl:template>
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread