Re: [xsl] Dynamic Index?

Subject: Re: [xsl] Dynamic Index?
From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx>
Date: Thu, 8 Mar 2001 09:20:38 +0000
Hi Ben,

> I am trying to create an index.html file that is created by applying
> testfile.xml to index.xsl through a cocoon processor. After the
> index.html is created there should be a list of links that go to a
> "details" document. The "details" document is created by parsing:
> testfile.xml to an XSLT Producer called MSDWProducer using a
> variable $testsuite_name. This variable $testsuite_name passed to
> detail.xsl should indicate the node from the testfile.xml that
> should be rendered using detail.xsl and the cocoon processor.

There are just a few things that are wrong in your code which are
probably messing things up.

The name of the parameter $testsuite_name is 'testsuite_name' - you
only use the '$' at the beginning when you're referring to the value
of the parameter, not when you're creating it or passing values to it.

So the link in index.xsl:

> <A>
>    <xsl:attribute
> name="HREF">testfile.xml?producer=MSDWProducer&XSL=detail.xsl&$testsuite_nam
> e=<xsl:value-of select="@name"/>
>    </xsl:attribute>
>    <xsl:value-of select="@name"/>
> </A>

Should be:

     <xsl:value-of select="@name" />

Note, no $ before the string testsuite_name.

Similarly, in detail.xsl, the parameter declaration:

> <xsl:variable name="$testsuite_name"/>

Should be a parameter (so that you can pass values into it from the
outside world) and the name shouldn't have a '$' in it:

<xsl:param name="testsuite_name" />

Now, you want to apply templates to the testsuite whose 'name'
attribute is the same as $testsuite_name.  So change your

> <xsl:apply-templates
> select="all-junit-reports/testsuite[@name='
> chLoadTestSuite']"/>


      select="all-junit-reports/testsuite[@name = $testsuite_name]" />

That means that only the testsuite that you're interested in will have
templates applied to it.  You then need a general template that
matches any testsuite and gives output for it.  So instead of:

> <xsl:template match="all-junit-reports/testsuite[@name='$testsuite_name']">
>    ...
> </xsl:template>

You want just:

<xsl:template match="testsuite">

[Note: in the above template you're matching any testsuite that is a
child of all-junit-reports (which they all are, so there's no point
testing for that) and whose 'name' attribute equals the string
'$testsuite_name'. For one thing, you don't want to be testing for
that string, but rather the parameter value, so you don't want quotes.
But for another, it's illegal in XSLT to have parameter or variable
references in the match attribute of xsl:template.  That doesn't
matter, though - if the testsuite that you're interested in is the
only one that's having templates applied to it, there's no need to
have a template that only matches that testsuite - it's like doing the
same test twice.]

I hope that helps,


Jeni Tennison

 XSL-List info and archive:

Current Thread