xsl-list
[Top] [All Lists]

RE: [xsl] Parameter passing through call to "document"

2006-03-16 19:26:27
You have a template that matches "/projects". In this template you do an 
apply-templates and attempt to pass a parameter named "project_id". The value 
you assign to this parameter appears to be a node named "record_id_". There is 
your problem. This construct assumes an XPath structure of 
"/projects/record_id_", where in the actual document the XPath is 
"/projects/record/record_id_".

When you assign "/projects/record_id_" to the value of the parameter, you are 
selecting a node that doesn't exist. Ergo, you get the default value of the 
parameter.
-- 
Charles Knell
cknell(_at_)onebox(_dot_)com - email



-----Original Message-----
From:     William Scarvie <wscarvie(_at_)hotmail(_dot_)com>
Sent:     Thu, 16 Mar 2006 16:00:25 -0800
To:       xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject:  [xsl] Parameter passing through call to "document"

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>



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--