应用所有模板
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 元素?