我可以将xslt模板的结果作为参数传递给另一个模板吗?

时间:2010-07-16 23:58:59

标签: xslt

我试图基本上使用XSLT模板重新创建ASP.NET母版页的功能。

我有一个“母版页”模板,其中包含存储在.xslt文件中的大部分页面html。我有另一个特定于单个页面的.xslt文件,它接受表示页面数据的xml。我想从我的新模板中调用母版页模板,并且仍然能够插入我自己的xml将被应用。如果我可以通过一个允许我用param作为名称调用模板的参数,那就可以了,但这似乎不允许。

基本上我有这个:

<xsl:template name="MainMasterPage">
  <xsl:with-param name="Content1"/>
  <html>
    <!-- bunch of stuff here -->
    <xsl:value-of select="$Content1"/>
  </html>
</xsl:template>

而且:

<xsl:template match="/">
  <xsl:call-template name="MainMasterPage">
    <xsl:with-param name="Content1">
      <h1>Title</h1>
      <p>More Content</p>
      <xsl:call-template name="SomeOtherTemplate"/>
     </xsl:with-param>
   </xsl-call-template>
</xsl:template>

嵌套的xml基本上被剥离了,所有插入的都是“TitleMore Content”

1 个答案:

答案 0 :(得分:5)

提供的代码存在问题:

<xsl:value-of select="$Content1"/>

这将输出$Content1的顶级节点(如果它包含文档)的所有文本节点后代的串联或其第一个元素或文本子节点的字符串值(如果它是XML片段) )。

您需要使用

<xsl:copy-of select='$pContent1'>

而不是

<xsl:value-of select='$pContent1'>

这会正确复制$pContent1

的所有子节点

以下是更正后的转化

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

<xsl:template match="/">
  <xsl:call-template name="MainMasterPage">
    <xsl:with-param name="pContent1">
      <h1>Title</h1>
      <p>More Content</p>
      <xsl:call-template name="SomeOtherTemplate"/>
     </xsl:with-param>
   </xsl:call-template>
</xsl:template>

<xsl:template name="MainMasterPage">
  <xsl:param name="pContent1"/>
  <html>
    <!-- bunch of stuff here -->
    <xsl:copy-of select="$pContent1"/>
  </html>
</xsl:template>

 <xsl:template name="SomeOtherTemplate">
   <h2>Hello, World!</h2>
 </xsl:template>
</xsl:stylesheet>

当对任何XML文档(未使用)应用此转换时,会生成所需的正确结果

<html>
   <h1>Title</h1>
   <p>More Content</p>
   <h2>Hello, World!</h2>
</html>