【发布时间】:2013-12-16 15:29:09
【问题描述】:
我正在寻找如何根据 XML 文件中的参数将模板应用于 XML 文件。
XML 文件的格式如下:
<workfile>
<query>
<some-info-1/>
<some-info-2/>
<some-info-3/>
<some-info-4/>
<some-info-5/>
<some-info-6/>
<some-info-7/>
<parameter name="hours-min" value="7" />
<parameter name="hours-max" value="9" />
<parameter name="output-type" value="type-1" />
</query>
</workfile>
XML 文件由另一个程序生成,需要特定的输出格式,具体取决于参数“output-type”的值。此参数可以出现多次,如果必须同时为多个输出生成结果,则需要一个for-each 循环。
编辑这是一个带有多个输出类型参数的示例:
<workfile>
<query>
<some-info-1/>
<some-info-2/>
<some-info-3/>
<parameter name="hours-min" value="7" />
<parameter name="hours-max" value="9" />
<parameter name="output-type" value="type-1" />
<parameter name="output-type" value="type-2" />
<parameter name="output-type" value="type-3" />
</query>
</workfile>
我想创建一个主模板文件generate-main.xsl,并在该文件中导入/包含其他模板文件(generate-type-1.xsl、generate-type-2.xsl 等)。这些模板中的每一个都必须从根节点 (/) 开始工作。但我在构思如何做到这一点时遇到了问题。
这是我写的generate-main.xslbase:
<xsl:template match="/">
<results>
<xsl:for-each select="/workfile/query/parameter[@name='output-type']">
<xsl:variable name="outputType" select="./@value" />
<xsl:choose>
<xsl:when test="$outputType='type-1'">
<xsl:call-template name="type-1" />
</xsl:when>
<xsl:when test="$outputType='type-2'">
<xsl:call-template name="type-2" />
</xsl:when>
<xsl:when test="$outputType='type-3'">
<xsl:call-template name="type-3" />
</xsl:when>
<xsl:when test="$outputType='type-4'">
<xsl:call-template name="type-4" />
</xsl:when>
<xsl:when test="$outputType='type-5'">
<xsl:call-template name="type-5" />
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</results>
</xsl:template>
<xsl:template name="type-1">
<!-- TO DO -->
</xsl:template>
<xsl:template name="type-2">
<!-- TO DO -->
</xsl:template>
<xsl:template name="type-3">
<!-- TO DO -->
</xsl:template>
<xsl:template name="type-4">
<!-- TO DO -->
</xsl:template>
<xsl:template name="type-5">
<!-- TO DO -->
</xsl:template>
</xsl:stylesheet>
我确实对此进行了研究。例如,Dimitre Novatchev 回答了模板何时位于同一个 XSL 文件 (Applying different XSLT template depending on a parameter) 中的问题,但我没有找到如何使用从根节点工作的导入 XSL 文件来做到这一点。
所以我的问题是:
1) 是否可以将模板包含或导入到主 XSL 文件中,并且仅根据参数调用一个模板(例如,通过在被调用模板中播放包含?)
2) 如果所有包含的模板都可以与根节点一起使用(我假设以<template match="/"> 开头),是否仍然有可能?
任何帮助将不胜感激。
安东·哈里斯
【问题讨论】:
-
我还找到了如何调用带有参数的模板,以指定根节点(call xslt template with parameter),但我没有看到如何将其应用于被调用的模板。
-
您能否提供一个包含多个“参数”的输入示例?并指定在这种情况下的预期输出是什么?请注意,“参数”通常是指调用例程在运行时提供给样式表的东西,而不是作为数据的一部分包含在已处理的 XML 中的东西。
-
参数实际上是一个标签,
<parameter>。其他参数不影响调用哪个模板。其他参数包括最短工作时间 (<parameter name="min-hours" value="7" />)、最长工作时间 (<parameter name="max-hours" value="9" />) 等。我已经编辑了代码以在示例中包含其他参数。 -
我的意思是一个带有多个“输出类型”参数的示例。
-
我用多个输出类型参数编辑了一个示例 XML。
标签: xml templates xslt xslt-2.0