我希望了解如何根据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 1.xsl、generate 2.xsl等等)。每个模板都必须从根节点(/)开始工作。但我在构思如何做这件事时遇到了问题。
这就是我写的generate-main.xsl基础:
<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回答了这个问题,因为模板位于同一个XSL文件(Applying different XSLT template depending on a parameter)中,但我没有找到如何使用从根节点导入的XSL文件。
所以我的问题是:
( 1)是否可以将模板包含或导入到主XSL文件中,并仅根据参数调用模板(例如,通过在调用模板中播放include )?
( 2)如果所有包含的模板都与根节点一起工作(我假设,从<template match="/">开始),是否仍有可能?
任何帮助都将不胜感激。
安东哈里斯
发布于 2013-12-16 16:14:14
当没有可用的源文档时,在编译时包含和导入工作,因此不能根据数据中找到的内容导入或包含内容(除非您想进入动态样式表生成,我怀疑这在这里是合适的)。
我不清楚为什么你不能使用标准的应用模板机制来解决这个问题。替换这些东西:
<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:template name="type-1">
<!-- TO DO -->
</xsl:template>(这是非常不像XSLT的,冗长的)
使用
<xsl:apply-templates select="/workfile/query/parameter[@name='output-type']"/>
<xsl:template match="parameter[@name='output-type'][@value='type1']">
<!-- TO DO -->
</xsl:template>等。
为什么要在根节点启动所有包含的模板?
发布于 2013-12-16 17:29:40
我想这里有两个问题:
第一个问题的答案肯定是肯定的。您可以在主样式表中包含其他样式表,并以与主样式表中的模板相同的方式调用它们的模板。每个模板都可以选择它需要选择的任何东西--包括从根开始,如果需要的话。
请注意,所包含的样式表总是包括在内--而不考虑在运行时发生了什么。您可以根据输入来决定是否使用它们,但它们将始终存在。
第二个问题的答案比较困难,因为描述太抽象了。我怀疑您可以从一个“输出”模板中获得更多的里程,这个模板多次调用--每次使用不同的参数。然后使用模板中的choose元素生成适当的输出。
https://stackoverflow.com/questions/20614525
复制相似问题