当前位置: 首页 > 知识库问答 >
问题:

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

哈骞仕
2023-03-14

我正在寻找如何根据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文件由另一个程序生成,需要特定的输出格式,具体取决于参数“outt-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>

我想创建一个主模板文件。xsl,并在文件中导入/包括其他模板文件(generate-type-1.xsl、generate-type-2.xsl等)。这些模板中的每一个都必须从根节点(/)开始工作。但我在设想如何做到这一点时遇到了问题。

这是生成主代码。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文件中时的问题(根据参数应用不同的XSLT模板),但我不知道如何使用从根节点工作的导入XSL文件来做到这一点。

因此,我的问题是:
1)是否可以将模板包括或导入到主XSL文件中,并根据参数仅调用一个模板(例如,通过在被调用的模板中播放include?)
2)如果所有包含的模板都与根节点一起工作(并且,我假设,从<代码>

任何帮助都将不胜感激。

安东·哈里斯


共有2个答案

左丘边浩
2023-03-14

我认为这里有两个问题:

  1. 你能做你想做的吗

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

请注意,始终包含包含的样式表,而不考虑运行时会发生什么。您可以根据输入决定是否使用它们;但他们将永远在那里。

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

东方河
2023-03-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>

为什么您希望所有包含的模板都从根节点开始?

 类似资料:
  • 我正在使用XML构建调查。调查中的一个(矩阵)问题,具有列和行,如下所示: 我想使用不同的XSLT模板,这取决于 节点。因此,尽管所有问题都是以相同的方式构建的,但它们看起来可能不同。我想用不同的。每个问题类型的XSLT文件,定义问题、列和行的外观。 如果我使用以下代码包括“模块/模板”: 该模板包含问题、行和列的格式定义。如果同一页面上有不同类型的问题,会不会出现干扰,因为定义每种类型的问题、行

  • 问题内容: 我应该使用 要么 当 导入模块 ,并和有 改变名字没有必要/愿望 ()? 有什么区别吗?有关系吗? 问题答案: 假设是中的模块或包,没有区别*,那就没关系。这两个语句具有完全相同的结果: 如果不是模块或软件包,则第二种形式将不起作用;引发回溯: *在Python 3.6及更高版本中,包含其他模块的软件包的初始化顺序存在一个错误,即在软件包 的加载阶段,在子模块中使用 该软件包 会失败,

  • 我有一个XML,我必须循环测试结果和组件。当组件的类型与特定名称匹配时,我必须对该组件应用不同的模板。我为每种组件类型创建了一个XSL-to,具有不同的模板,例如:NORMALTEXTBOX。但是这些模板并没有被应用到组件块中。。。谁能帮我一下吗? XML XSL

  • 如果我们说为特定节点应用模板,那么它将应用于整个xml中,无论它在哪里找到该节点/标记。 我的问题是我有一个xml,我需要根据条件应用模板,基本上保持一些秩序。 输入xml: 输出应为, 我的XSLT是这样的, 需要根据以下条件重新构造XSL, 我只想在注释不是作为表的前兄弟或后兄弟出现时应用注释模板。如果它在表的后面或前面,那么它应该位于表之间、表的下面或上面,就像在输出中一样。 谢啦

  • 我想实现一个基于布尔模板参数的私有函数。大概是这样的: 但是上面的程序没有编译:错误:“struct std::enable_if”void funInternal(int a,typename std::enable_if::type*=0)中没有名为“type”的类型。 是否可以使用enable_if实现所需的行为?

  • 问题内容: 我正在尝试在NestJs控制器中同时应用和参数。 目的是仅适用于Body DTO中的所有参数,但所有参数均适用。 但是,我似乎无法按照我想要的方式来应用两个管道。这是我所拥有的: 我试图让另一个人使用该变压器,但这不起作用。 我怎样才能同时应用和应用参数? 问题答案: 如果应用到PARAM,它只会改变,但没有财产的,在这里它会留一个。 相反,您可以使用将参数转换为: 然后将搭配使用选项