Re: [xsl] Displaying Element Values - basic ?

Subject: Re: [xsl] Displaying Element Values - basic ?
From: "Jay Bryant" <jay@xxxxxxxxxxxx>
Date: Wed, 3 Jan 2007 10:32:14 -0600
Forgive me if this posted already.

I'm having trouble pulling the value of an element, I want to read the
value of element <Assignment>. I can't figure out how to do it, even
though it's extremely basic. I'm using the W3C xslt tutorial and they
really don't have anything on how to do this, using my format. I would
like to keep my xml structure, because this is easy to read format and
it's generated dynamically by a PHP application. Can anyone give me a tip?

xml:
       <Assignments>
               <Assignment duedate = "1/21/07" assigned =
"1/02/07">Read Ch.3</Assignment>
               <Assignment duedate = "1/30/07" assigned =
"1/02/07">Test Ch. 3</Assignment>
       </Assignments>

My current XSLT:
       <xsl:for-each select="Assignments/Assignment">
               <tr>
                       <td><xsl:value-of select="@DateDue"/></td>
                       <td><xsl:value-of select="@DateAssigned"/></td>
                       <!-- Not going to pull the value -->
                       <td><xsl:value-of select="Assignment"></td>
               </tr>
       </xsl:for-each>

One of the core concepts of XSTL is context. In your case, the for-each instruction sets the context to the Assignment elements. For <xsl:value-of select="Assignment"> to work, an Assignment element would have to have an Assignment element as a child.


What you need to do is select the current context, thus:

<xsl:value-of select=".">

Also, I bet your overall design would benefit from applying templates at each level rather than using for-each to reach past an intermediate level of elements. For people coming from a procedural language, for-each seems like a for loop and feels comfortable. Unfortunately, that's a dangerous mis-perception that usually leads to some really hard-to-solve issues. So, I suggest you get in the habit of doing things the XSLT way and use templates as your first choice and for-each when you must.

To do the same thing with templates, by the way, you'd have two templates, thus:

<xsl:template match="Assignments">
 <xsl:apply-templates/>
</xsl:template>

<xsl:template match="Assignment">
 <tr>
   <td><xsl:value-of select="@DateDue"/></td>
   <td><xsl:value-of select="@DateAssigned"/></td>
   <td><xsl:value-of select="."/></td>
 </tr>
</xsl:template>

HTH

Oh, and welcome to XSLT.

Jay Bryant
Bryant Communication Services


Current Thread