匹配多个输出文件的模板
我有一个输出为 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">
其中“guidance”是我的源 XML 的根节点。这是不正确的,因为我必须嵌套一个模板。解决这个问题的正确方法是什么?
谢谢。
I have an XSL document that outputs to html. I want to run a batch process, using a filelist.xml to perform this transform on multiple XML input documents, with corresponding html output files, as below:
<?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>
How can I then apply templates to each of these files, the same as if I was processing one single file? ie:
<xsl:template match="guidance">
Where "guidance" is the root node of my source XML. This is incorrect as I would have to nest a template. What would be the correct approach to this problem?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用 xsl:template match="guidance" 定义模板规则没有任何问题。它只需遵循通常的 XSLT 原则,即所有模板规则都出现在最外层(全局)级别。要调用模板,您可以执行类似 xsl:apply-templates select="document(@href)/guidance" 的操作。
如果您想让事情变得更加模块化,您可以 (a) 将一种文档类型的所有模板规则放入一个样式表模块中,和/或 (b) 对每种文档类型的模板规则使用不同的模式。
There's nothing wrong with defining a template rule with xsl:template match="guidance". It just has to follow the usual XSLT principle that all template rules appear at the outermost (global) level. To invoke the template you do something like xsl:apply-templates select="document(@href)/guidance".
If you want to make things more modular you can (a) put all the template rules for one document type in one stylesheet module, and/or (b) use a different mode for the template rules for each document type.
使用:
并在
mode="filelevel"
中提供任何必要的模板来处理单个文件。Use:
and provide any necessary templates in
mode="filelevel"
to process a single file.