【问题标题】:Template matching multiple output files匹配多个输出文件的模板
【发布时间】:2011-02-17 15:38:11
【问题描述】:

我有一个输出为 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">

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

谢谢。

【问题讨论】:

  • 如果文件 filelist.xml 是您的样式表的主要输入文件,那么请向我们展示该文件的示例结构。如果此文件链接到您要处理的其他文件,那么还向我们展示您要处理的那些文件的样本。然后显示您要为每个文件创建的输出示例。目前我不确定问题是什么。您当然可以将&lt;xsl:template match="guidance"&gt;...&lt;/xsl:template&gt; 放入您的样式表中,然后将其应用到例如&lt;xsl:apply-templates select="$contents/guidance"/&gt;xsl:result-document 内。
  • 好问题,+1。请参阅我的答案以获得自然而简单的解决方案。
  • 您可能会遇到“根规则”的问题:请注意,此规则将匹配任何文档的根文档。因此,不要将模板应用到 $contents 文档根目录,而是使用 $contents/node()
  • @martin honnen。谢谢 - 在这种情况下似乎可以解决问题:&lt;xsl:apply-templates select="$contents/guidance"/&gt;。非常感谢。

标签: xml xslt xslt-2.0 saxon


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    使用

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 1970-01-01
      • 2016-07-07
      • 2011-06-12
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多