在xsl:result-document中调用模板

时间:2014-08-20 13:19:12

标签: xml xslt

我正在尝试使用以下代码生成多个文件:

<xsl:output method="text"/>
<xsl:output method="html" indent="yes" name="html"/>

<xsl:template match="/">
<xsl:for-each select="Content[(@index &gt; 1) and (string-length(Item[1]) != 0) and (string-length(Item[2]) = 0)]">


    <xsl:variable name="filename" select="concat('output1/',@Item[1],'.html')" />
    <xsl:value-of select="$filename" />  
    <xsl:result-document href="{$filename}" format="html">
             <html><body>
                   <xsl:apply-templates select="Content" mode="create" />
             </body></html>
     </xsl:result-document>
 </xsl:for-each>
 </xsl:template>

无论我的XML文件和“创建”模板在这一点上实际上是不相关的,我的程序根本不会在body标签内调用模板。当我在Eclipse中调试程序时,我的代码没有进入并运行结果文档标记所包含的内容。

****代码能够生成具有所需文件名的多个文件。但它们在身体标签中没有任何东西。

另外,如果我将代码更改为:

        <xsl:result-document href="{$filename}" format="html">
             <html><body>
                   <xsl:value-of select="$filename"/>
             </body></html>
     </xsl:result-document>

它能够使用body标签中的文件名生成多个文件。 请帮忙!

1 个答案:

答案 0 :(得分:1)

xsl:apply-templates/@select属性应根据输入XML文档进行选择。它应该看起来像:

<xsl:apply-templates select="." mode="create" />

如你所知,xsl:apply-templates正在寻找并且没有在当前节点找到filename元素。

更新每个OP编辑的XSLT:

如果Content您正在迭代,则不想选择Content;选择.,即当前节点。

您还必须确保拥有与Content元素匹配的模板:

<xsl:template match="Content" mode="create">
  Output something here
</xsl:template>

最后,您的xsl:for-each位于匹配/的模板中然后迭代Content个孩子的事实看起来很可疑。只能有一个根格式良好的XML中的节点。