Closed
Bug 546509
Opened 16 years ago
Closed 16 years ago
with-param doesn't work with apply-templates
Categories
(Core :: XSLT, defect)
Tracking
()
RESOLVED
INVALID
People
(Reporter: dfradin, Unassigned)
Details
Attachments
(2 files)
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20100106 Ubuntu/9.10 (karmic) Firefox/3.5.7
Build Identifier: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20100106 Ubuntu/9.10 (karmic) Firefox/3.5.7
When trying to pass parameters, by using the element <xsl:with-param/>, to templates applied through the element <xsl:apply-templates>, said parameters' values are simply ignored by the templates involved, that systematically fall back to default values, if any.
Reproducible: Always
Steps to Reproduce:
1.Create a trivial XML file, with just a root element and a few children elements. Example:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>value1</child>
<child>value2</child>
<child>value3</child>
</root>
2.Create a XSLT sheet designed to turn the XML file into a HTML file with an unordered list containing as items the values of the children elements, using the apply-templates element to process the latter ones, with a parameter of which value will be appened to each of them, between parentheses.
Example :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>trivial example</title>
</head>
<body>
<ul>
<xsl:apply-templates select="root">
<xsl:with-param name="thingy" select="'stuff'"/>
</xsl:apply-templates>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="child">
<xsl:param name="thingy"/>
<li><xsl:value-of select="."/>(<xsl:value-of select="$thingy"/>)</li>
</xsl:template>
</xsl:stylesheet>
3. Attach the stylesheet to the XML file with a proper <?xml-stylesheet?> declaration, then display the XML file in, for example, FireFox.
Actual Results:
The browser displays the following:
* item1()
* item2()
* item3()
* item4()
Expected Results:
* item1(stuff)
* item2(stuff)
* item3(stuff)
* item4(stuff)
This is a standard compliance issue, since the <xsl:apply-templates> element should be able to take parameters to transmit to its templates, as specified in the W3C recommendation for XSLT 1.0.: http://www.w3.org/TR/xslt#section-Passing-Parameters-to-Templates
I tested my example with xsltproc, which gave the expected result.
For information: there's no such issue with the <xsl:call-template> element, whith which parameters work quite fine.
Could you attach the testcase as a file. That will allow for much easier testing.
| Reporter | ||
Comment 2•16 years ago
|
||
| Reporter | ||
Comment 3•16 years ago
|
||
Ah, I see the bug in the stylesheet now.
The <xsl:apply-templates> doesn't actually directly apply the template that accepts a parameter. You are trying to apply templates to the <root> element. However there is no template in your stylesheet that applies to the <root> element. Thus a default template is applied. This default template applies templates to all children, however it does not forward any parameters.
This is all per spec.
If you change it to <xsl:apply-templates select="root/child"> then it should work.
Status: UNCONFIRMED → RESOLVED
Closed: 16 years ago
Resolution: --- → INVALID
You need to log in
before you can comment on or make changes to this bug.
Description
•