RE: [xsl] XPath attribute expression

Subject: RE: [xsl] XPath attribute expression
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 19 Dec 2006 15:37:20 -0000
> So, I need a pure XPath expression -- probably XPath 1.0.  Any ideas?

In general, XPath 1.0 doesn't have the expressive power to perform join
operations. You can probably do it in two steps: first bind a variable to
the value you are searching for, then do 

/topLevel/ents/ent[@name=$name]/value

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

> 
> 
> -----Original Message-----
> From: Alexey Nickolaenkov [mailto:nikolaenkov@xxxxxxxxxxxx]
> Sent: Tuesday, December 19, 2006 1:29 AM
> To: Hintz, David L
> Subject: Re: [xsl] XPath attribute expression
> 
> Tuesday, December 19, 2006, 2:27:52 AM, you wrote:
> 
> HDL> Assume that my document has this structure:
> 
> HDL> <topLevel>
> HDL>    <ents>
> HDL>       <ent name="abc"><value>test1</value></ent>
> HDL>       <ent name="def"><value>test2</value></ent>
> HDL>    </ents>
> HDL> .
> HDL> .
> HDL> .
> HDL> <para>This is a <entRef name="def"/>.</para>
> 
> HDL> What XPath expression can I use in context of this 
> <entRef> element
> to
> HDL> reference the content of the <value> element that 
> matches the <ent>
> name
> HDL> attribute (as shown above).  I've gotten this far:
> 
> HDL> /topLevel/ents/ent[@name]/value
> 
> HDL> But, that always returns the first value.  Somehow I need to test
> @name
> HDL> that equals the "name" of the current tag.
> 
> I think that problem is not in XPath but in templates. I 
> suppose something like that will suit for you:
> 
>    <xsl:key name="ents-by-name" use="@name" match="//ents/ent"/>
> 
>    <xsl:template match="topLevel">
>         <html>
>           <head>
>             <meta http-equiv="Content-Type" 
> content="text/html; charset=windows-1251"/>
>             <title>test</title>
>            </head>
>           <body>
>             <xsl:apply-templates select="page"/>
>           </body>
>         </html>
>    </xsl:template>
> 
>    <xsl:template match="para">
>       <p><xsl:apply-templates select="@*|node()"/></p>
>    </xsl:template>
> 
>    <xsl:template match="entRef">
>       <xsl:variable name="ent-name" 
> select="key('ents-by-name', @name)"/>
>       <b>
> 
>          <xsl:choose>
>             <xsl:when test="$ent-name">
>                <xsl:value-of select="$ent-name"/>
>             </xsl:when>
> 
>             <xsl:otherwise>
>                <xsl:text/>Undefined ent
>             </xsl:otherwise>
>          </xsl:choose>
>       </b>
>    </xsl:template>
> 
> 
> 
> -- 
> Alexey                            
> mailto:alexey.nikolaenkov@xxxxxxxxxxxx

Current Thread