Re: [xsl] using xsl:with-param in apply-templates problem

Subject: Re: [xsl] using xsl:with-param in apply-templates problem
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Tue, 27 Aug 2002 13:17:14 +0100
Hello Niki :)

> David, thanks for your advice, I have change the SS accordingly, it
> all seems to work apart from the param being passed:

You're probably losing the parameter en-route from the document
element of the document you're processing to the ATITLE, BTITLE etc.
elements in the body of the document. The built-in template, used for
the document element of that document, is:

<xsl:template match="*" mode="file">
  <xsl:apply-templates mode="file" />
</xsl:template>

As you can see, the parameter doesn't get passed through this built-in
template. So try overriding it so that the parameter gets passed
through to the children of the element:

<xsl:template match="*" mode="file">
  <xsl:param name="filename" />
  <xsl:apply-templates mode="file">
    <xsl:with-param name="filename" select="$filename" />
  </xsl:apply-templates>
</xsl:template>

[Note that in XSLT 2.0, parameters will get passed through by default
so you won't have to worry about this.]

Also note what David said about match patterns -- they never need to
start with '//' -- //foo matches "foo elements that are descendants of
the root node" but *all* foo elements must be descendants of a root
node, so there's no point testing that. Your template:

<xsl:template match="//ATITLE|//BTITLE|//CTITLE|//DTITLE|//ETITLE|//FTITLE"
              mode="file">
  <xsl:param name="filename"/>
  <title>
    <xsl:attribute name="filename">
      <xsl:value-of select="$filename"/>
    </xsl:attribute>
    <xsl:attribute name="chapID">
      <xsl:value-of select="ancestor::*[last()]/attribute::ID"/>
    </xsl:attribute>
    ...
  </title>
  ...
</xsl:template>

would be better as:

<xsl:template match="ATITLE|BTITLE|CTITLE|DTITLE|ETITLE|FTITLE"
              mode="file">
  <xsl:param name="filename"/>
  <title filename="{$filename}" chapID="{/*/@ID}">
    ...
  </title>
  ...
</xsl:template>

[I've also used attribute value templates here just 'cos they're
shorter, and note that "ancestor::*[last()]/attribute::ID" is
equivalent to "/*/@ID" -- the ID attribute of the document element. (Is
that what you meant to do, or did you want "../@ID", the ID attribute
of the element's parent?)]

Cheers,

Jeni

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


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


Current Thread