首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何基于参数应用或导入XSLT模板

如何基于参数应用或导入XSLT模板
EN

Stack Overflow用户
提问于 2013-12-16 15:29:09
回答 2查看 1.1K关注 0票数 0

我希望了解如何根据XML文件中的参数将模板应用于XML文件。

XML文件具有以下格式:

代码语言:javascript
复制
<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循环。

这里的编辑是一个包含几个输出类型参数的示例:

代码语言:javascript
复制
<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基础:

代码语言:javascript
复制
<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="/">开始),是否仍有可能?

任何帮助都将不胜感激。

安东哈里斯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-16 16:14:14

当没有可用的源文档时,在编译时包含和导入工作,因此不能根据数据中找到的内容导入或包含内容(除非您想进入动态样式表生成,我怀疑这在这里是合适的)。

我不清楚为什么你不能使用标准的应用模板机制来解决这个问题。替换这些东西:

代码语言:javascript
复制
<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的,冗长的)

使用

代码语言:javascript
复制
<xsl:apply-templates select="/workfile/query/parameter[@name='output-type']"/>

<xsl:template match="parameter[@name='output-type'][@value='type1']">
<!-- TO DO -->
</xsl:template>

等。

为什么要在根节点启动所有包含的模板?

票数 2
EN

Stack Overflow用户

发布于 2013-12-16 17:29:40

我想这里有两个问题:

  1. 你能做你想做的事吗?
  2. 你应该做你想做的事吗?

第一个问题的答案肯定是肯定的。您可以在主样式表中包含其他样式表,并以与主样式表中的模板相同的方式调用它们的模板。每个模板都可以选择它需要选择的任何东西--包括从根开始,如果需要的话。

请注意,所包含的样式表总是包括在内--而不考虑在运行时发生了什么。您可以根据输入来决定是否使用它们,但它们将始终存在。

第二个问题的答案比较困难,因为描述太抽象了。我怀疑您可以从一个“输出”模板中获得更多的里程,这个模板多次调用--每次使用不同的参数。然后使用模板中的choose元素生成适当的输出。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20614525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档