[xsl] Parameter passing through call to "document"

Subject: [xsl] Parameter passing through call to "document"
From: "William Scarvie" <wscarvie@xxxxxxxxxxx>
Date: Thu, 16 Mar 2006 16:00:25 -0800
Hi all,

I'm trying to use xsl:apply-templates, selecting an external document, and using xsl:with-param to pass a parameter to the template that will handle the incoming document.

For some reason, the value passed in the parameter never makes it to the template. Instead, I get the default value.

If I do a test changing the select of the xsl:apply-templates call such that I'm passing in children of the current context, the value passes into the template just fine.

I know the "document" call is working correctly, and the tasks template is being called, because if I take out the xsl:if test, I get all records to show up under each project.

I've appended sample code to show you what I'm up to. Generally, I have one file containing projects, and another containing tasks. There is a 1:many relationship between projects:tasks, identified by the contents of the "record_id_" tag in the Projects XML and the "related_project" tag in the Tasks XML. When the values match, the task is related to the project.

I'm trying to emit a table that shows, for each project, a list of all tasks associated with the project.

Thanks very much in advance. Any help with what I'm doing wrong here, or suggestions for other ways to accomplish what I'm after, would be most appreciated.

Thanks again,

Will Scarvie

----- Project.xml -----
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="Project.xsl" ?>
<projects>
 <record>
   <project_family>Backlog</project_family>
   <priority>1</priority>
   <description>Highest Priority Backlog Project</description>
   <record_id_>4</record_id_>
 </record>
 <record>
   <project_family>Backlog</project_family>
   <priority>2</priority>
   <description>Lowest Priority Backlog Project</description>
   <record_id_>1</record_id_>
 </record>
 <record>
   <project_family>Next Year</project_family>
   <priority>2</priority>
   <description>Lowest Priority New Project</description>
   <record_id_>3</record_id_>
 </record>
 <record>
   <project_family>Next Year</project_family>
   <priority>1</priority>
   <description>Highest Priority New Project</description>
   <record_id_>2</record_id_>
 </record>
</projects>

----- Tasks.xml -----
<?xml version="1.0" ?>
<tasks>
 <record>
   <rank>1</rank>
   <description>Task One</description>
   <related_project>4</related_project>
   <record_id_>114</record_id_>
 </record>
 <record>
   <rank>4</rank>
   <description>Task Four</description>
   <related_project>4</related_project>
   <record_id_>114</record_id_>
 </record>
 <record>
   <rank>3</rank>
   <description>Task Three</description>
   <related_project>3</related_project>
   <record_id_>114</record_id_>
 </record>
 <record>
   <rank>2</rank>
   <description>Task Two</description>
   <related_project>3</related_project>
   <record_id_>114</record_id_>
 </record>
</tasks>

----- Project.xsl -----
<xsl:stylesheet version="1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>


<xsl:template match="/projects">
<html>
<body>
<table border="1" width="100%" cellpadding="5">
<tr>
<th>Family</th>
<th>Priority</th>
<th>Description</th>
</tr>
<xsl:for-each select="record">
<xsl:sort data-type="text" select="project_family"/>
<xsl:sort data-type="number" select="priority"/>
<tr>
<td>
<xsl:value-of select="project_family"/>
</td>
<td>
<xsl:value-of select="priority"/>
</td>
<td>
<xsl:value-of select="description"/>
</td>
</tr>
<tr>
<td>
</td>
<td colspan="2">
About to call apply-templates, with project_id of <xsl:value-of select="record_id_"/>
<xsl:apply-templates select="document('Tasks.xml')">
<xsl:with-param name="project_id" select="record_id_"/>
</xsl:apply-templates>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>


<xsl:template match="/tasks">
 <xsl:param name="project_id" select="'undefined'"/>
Entering Tasks template<BR/>
Project ID parameter is: <xsl:value-of select="$project_id"/><BR/>
 <xsl:for-each select="record">
   <xsl:sort data-type="number" select="rank"/>
     <xsl:if test="related_project = $project_id">
       Task: <xsl:value-of select="description"/><BR/>
       Rank: <xsl:value-of select="rank"/><BR/>
     </xsl:if>
 </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Current Thread