应用所有模板

Posted

技术标签:

【中文标题】应用所有模板【英文标题】:Apply ALL templates 【发布时间】:2018-01-23 05:21:37 【问题描述】:

我的主 xslt 文件导入了多个其他 xslt 文件,这些 xslt 文件也可能导入/包含 0、1 或许多 xslt 文件(也可能更多级别)

我想要一种方法,从主 xslt 文件调用与特定模式匹配的所有导入/包含的模板(它们具有相同的名称、相同的模式、相同的匹配或其他内容)。

我希望能够做到这一点,而无需对特定的导入列表进行硬编码(即,如果您添加新的导入,它应该会被自动拾取)

或者,提取具有给定名称的变量的值。

在任何一种情况下,结果都应该连接在一起形成一个节点集。 结果的顺序并不重要,包装元素是可选的(但可取)

这可能吗?

示例输入:

Main.xslt

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="File1.xslt"/>
  <!-- Some rules here, including the solution -->
</xsl:style>

文件1.xslt

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="File2.xslt"/>
  <!-- Some unrelated rules here -->
  <xsl:template name="Things">
    <!-- name could be mode or matches, or the template could be a variable instead -->
    <Something/>
  </xsl:template>
</xsl:style>

文件2.xslt

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Some unrelated rules here -->
  <xsl:template name="Things">
    <!-- name could be mode or matches, or the template could be a variable instead -->
    <SomethingElse/>
  </xsl:template>
</xsl:style>

需要的输出:

<xml>
  <Something/>
  <SomethingElse/>
</xml>

注意在我的场景中,所需模板/变量的内容将是静态的,尽管有一个可以包含 xslt 的解决方案会很好。

【问题讨论】:

告诉我们您想要实现什么(您的输入和期望的输出是什么),可能有一种实现它的方法并不那么奇怪。 +Michael Kay 请看编辑 您已经对要编写的代码进行了改造。我想知道你真正想要达到的目标。 大声笑,你要求输入和输出,这是我给的。 每个 xslt 文件都是一个模块。父级知道它需要哪些模块以及如何调用它们,但不知道该模块实际做了什么。这个想法是在输出此数据的模式下调用最外层的样式表。然后,该数据可用于在再次运行转换之前通知需要哪些输入(来自 sql 的数据),但使用实际数据。 【参考方案1】:

我想出了一个有点老套的方法来做到这一点。

<xsl:template name="EntryPoint">
  <xml>
    <xsl:apply-templates select="document('')/xsl:stylesheet/xsl:import/@href" mode="FindThings"/>
  </xml>
</xsl:template>
<xsl:template mode="FindThings" match="/xsl:stylesheet">
  <xsl:apply-templates select="document(xsl:import/@href)" mode="FindThings"/>
  <xsl:apply-templates select="xsl:variable[@name='Things']" mode="FindThings"/>
</xsl:template>
<xsl:template mode="FindThings" match="xsl:variable[@name='Things']">
  <xsl:copy-of select="*"/>
</xsl:template>
<xsl:template mode="FindThings" match="xsl:import/@href">
  <xsl:apply-templates select="document(.)" mode="FindThings"/>
</xsl:template>

无论导入的深度如何,它都会在每个导入的 xslt 文件中输出名为“Things”的所有***变量的内容。

【讨论】:

以上是关于应用所有模板的主要内容,如果未能解决你的问题,请参考以下文章

UI 模板视图 - iOs 应用程序上所有场景中的通用 UI 元素?

有关excel的模板应用问题

Django -- Python -- 如何在一个项目中的所有应用程序之间共享一个全局模板标签

未捕获的引用错误:应用引导模板后未定义 $

For 循环与应用模板

Django 找不到应用模板