我正在尝试使用以下代码生成多个文件:
<xsl:output method="text"/>
<xsl:output method="html" indent="yes" name="html"/>
<xsl:template match="/">
<xsl:for-each select="Content[(@index > 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标签中的文件名生成多个文件。 请帮忙!
答案 0 :(得分:1)
xsl:apply-templates/@select
属性应根据输入XML文档进行选择。它应该看起来像:
<xsl:apply-templates select="." mode="create" />
如你所知,xsl:apply-templates
正在寻找并且没有在当前节点找到filename
元素。
如果Content
您正在迭代,则不想选择Content
;选择.
,即当前节点。
您还必须确保拥有与Content
元素匹配的模板:
<xsl:template match="Content" mode="create">
Output something here
</xsl:template>
最后,您的xsl:for-each
位于匹配/
的模板中然后迭代Content
个孩子的事实看起来很可疑。只能有一个根格式良好的XML中的节点。