Re: [xsl] XPath attribute expression

Subject: Re: [xsl] XPath attribute expression
From: Alexey Nickolaenkov <nikolaenkov@xxxxxxxxxxxx>
Date: Tue, 19 Dec 2006 10:28:38 +0300
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