模板匹配多个输出文件

时间:2011-02-17 15:38:11

标签: xml xslt xslt-2.0 saxon

我有一个输出到html的XSL文档。我想运行批处理,使用filelist.xml对多个XML输入文档执行此转换,并使用相应的html输出文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

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

<xsl:template match="/">
<xsl:for-each select="//*:file">
<xsl:variable select="document(@url)" name="contents" />
<xsl:variable select="replace(@url,'[.]xml','.html')" name="newfile" />
Creating <xsl:value-of select="$newfile" />
<xsl:result-document href="{$newfile}" format="html">
 <html><body>
 Test run: <xsl:value-of select="$contents/testrun/@run" />
 </body></html>
</xsl:result-document>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

如何将模板应用于每个文件,就像处理单个文件一样?即:

<xsl:template match="guidance">

“guide”是我的源XML的根节点。这是不正确的,因为我必须嵌套模板。这个问题的正确方法是什么?

感谢。

2 个答案:

答案 0 :(得分:0)

  

“guide”是我的源XML的根节点。这是不正确的,因为我必须嵌套模板。这个问题的正确方法是什么?

使用xsl定义模板规则没有任何问题:template match =“guidance”。它必须遵循通常的XSLT原则,即所有模板规则都出现在最外层(全局)级别。要调用模板,请执行类似xsl的操作:apply-templates select =“document(@href)/ guidance”。

如果您想使模块更加模块化,您可以(a)将一个文档类型的所有模板规则放在一个样式表模块中,和/或(b)为每种文档类型使用不同的模板规则模式。 / p>

答案 1 :(得分:0)

  

然后,我如何将模板应用于每个模板   这些文件,就像我一样   处理一个文件?

使用

<xsl:apply-templates select="$contents" mode="fileLevel"/>

并在mode="filelevel"中提供任何必要的模板来处理单个文件。