匹配多个输出文件的模板

发布于 2024-10-18 01:31:43 字数 1078 浏览 4 评论 0原文

我有一个输出为 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无可置疑 2024-10-25 01:31:43

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

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

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

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?

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.

不必你懂 2024-10-25 01:31:43

然后我怎样才能将模板应用到每个
这些文件,就像我一样
处理单个文件?

使用

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

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

How can I then apply templates to each
of these files, the same as if I was
processing one single file?

Use:

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

and provide any necessary templates in mode="filelevel" to process a single file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文