This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: built in templates question


Hi Brian,

Note that in:

>   <heading2>
>     Course Information
>     <sub resource="Geo101_readings.doc">Reading
> List</sub>
>     <sub
> resource="Geo101_syllabus2.doc">Syllabus</sub>
>     <sub resource="Geo101_schedule.doc">Schedule</sub>
>   </heading2>

for example, the heading2 element contains a text node with the
(normalised) value "Course Information" and three child sub elements
that have their own text nodes.

When you get the string value of a node, for example by doing:

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

you get a string that's made by concatenating all the text node
*descendants* of the node (not only the children). For example, the
string value of the heading2 element above is (ignoring whitespace
issues):

  "Course Information Reading List Syllabus Schedule"

You're not interested in that string value; instead, you want the
value of the text node child of the node, so you want:

  <xsl:value-of select="text()" />

[If you can, I'd advise you change your XML so that, aside from
elements that have to contain mixed content because they contain
documentation, all your elements either contain *only* other elements
or *only* text. For example, use:

  <heading2>
    <title>Course Information</title>
    <sub resource="Geo101_readings.doc">Reading List</sub>
    <sub resource="Geo101_syllabus2.doc">Syllabus</sub>
    <sub resource="Geo101_schedule.doc">Schedule</sub>
  </heading2>

instead. That way you can use:

  <xsl:value-of select="title" />

and it's a lot clearer what piece of information you're pulling out.]

So your templates need to look like:

<xsl:template match="heading2">
  <xsl:choose>
    <xsl:when test = "@resource">
      <a href="{@resource}">
        <xsl:value-of select="text()"/>
      </a>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="text()"/><br/>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:apply-templates select="heading3"/>
  <xsl:apply-templates select="sub"/>
</xsl:template>

> Also, I would like to be able to present the output in the form of a
> navigation menu where the sub elements could be contained in a
> folder, which would open when clicked on, which I assume would
> involve using javascript. I haven't used js before so any advice on
> how I should approach this would also be appreciated.

Others might be able to give you more specific guidance, but a quick
Google search shows a proliferation of JavaScript navigation menus
available at http://www.sitenavigation.net/. Just bear in mind that
your XSLT will be constructing the JavaScript, which is just text as
far as it is concerned -- I recommend you create the HTML page with
JavaScript inside it first, and then work out how to create XSLT to
create that HTML page from your XML.

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]