【问题标题】:Re-using nested XSL templates重用嵌套的 XSL 模板
【发布时间】:2012-02-20 06:42:21
【问题描述】:

我正在尝试多次重复使用 XSL 模板,并在此模板中放置其他模板。

这是我的代码示例:

<xsl:template name="wrapper">
    <div>
        <xsl:apply-templates/>
    </div>
</xsl:template>

<xsl:template name="template1"></xsl:template>
<xsl:template name="template2"></xsl:template>

所以,现在我想在模板“包装器”中应用模板 1 和模板 2,类似这样(我知道这不是正确的代码,但想法就在那里):

<xsl:template name="template1">
    <xsl:template match="wrapper">
    <!--code here-->
    </xsl:template>
</xsl:template>
<xsl:template name="template2">
    <xsl:template match="wrapper">
    <!--code here-->
    </xsl:template>
</xsl:template>

对此的任何帮助将不胜感激。

【问题讨论】:

  • 这不是它的工作方式。你想做什么?请提供一些输入 XML 和所需的输出。
  • 我可以看到您想要实现的目标的边缘,但是正如@Tomalak 所说,除非我们有一些示例来帮助我们理解我们无法以任何有用的方式真正回答
  • 您知道&lt;xsl:call-template&gt; 并且您可以“嵌套”它们,即在命名模板中调用 call-template,是吗?
  • @Rinux,没有示例 xml,很难提出解决方案(您所期望的),我们可以用您的陈述诊断的所有问题都由 Hon' Tomalak 回答。提供一个 XML,它会很容易 :)
  • @DimitreNovaatchev,XSL 文件是一个巨大(现有)框架的一部分,其中包含大量 XML 和 XSL。问的时候其实是我第一次接触XSL,完全误解了XSL的正确使用方法。但是,我认为您的回答最接近我的要求。谢谢(所有)您的时间=)

标签: xslt


【解决方案1】:

所以,现在我想在模板“包装器”中应用模板 1 和模板 2,

如果我从字面上理解:

<xsl:template name="wrapper">
  <xsl:call-template name="template1" />
  <xsl:call-template name="template2" />
</xsl:template>

但我有一种强烈的直觉,你不知何故在这里开枪打死自己。

【讨论】:

  • 我正在使用模板 1 和 2 中的 xml。但是,包装器与 xml 无关。想法是这样的:&lt;xsl:template name="template1"&gt; &lt;xsl:template match="wrapper"&gt; &lt;!--code here--&gt; &lt;/xsl:template&gt; &lt;/xsl:template&gt; &lt;xsl:template name="template2"&gt; &lt;xsl:template match="wrapper"&gt; &lt;!--code here--&gt; &lt;/xsl:template&gt; &lt;/xsl:template&gt; 我是 XSL 的新手,我开始相信我以错误的方式使用它。但是,如果这样的事情是可能的,它会派上用场。
  • @Rinux:你还没有告诉我你想做什么。这是XY problem。您正在尝试做 X 并认为 Y 可能会起作用,所以您询问 Y 但从不告诉 X 是什么。请给我实际使用的 XML。
  • @Rinux:你仍然没有给我一些实际的 XML 来使用。
  • @Rinux:检查stackoverflow.com/q/9022980/254252stackoverflow.com/q/9022119/254252 以了解询问此类问题的好方法。还可以(深入)查看catb.org/esr/faqs/smart-questions.html - 说真的,它确实有帮助。
  • @Rinux 这有点不令人满意,但你去吧。 PS。出于这个问题(以及您是 XSLT 初学者的事实),我仍然认为如果您发布 XML,您可能会学到一两件事。
【解决方案2】:

将模板定义嵌套到另一个模板定义在语法上是非法的

根据 W3C XSLT(1.0 和 2.0)规范,xsl:template 必须是顶部元素 xsl:stylesheet 的子元素。

这意味着样式表模块中的所有模板都必须是同级的。

调用一个 命名模板的方法 是像这样使用xsl:call-template指令

<xsl:call-template name="someTemplateName">
 <!-- Possibly place one or more `xsl:with-param` elements here -->
</xsl:call-template>

但是,请注意

使用未命名模板(具有match 属性)并使用xsl:apply-templates 指令选择最佳匹配模板是一种很好的风格,并且更符合XSLT 的精神

SO XSLT 问题的大部分答案都展示了xsl:apply-templates 的使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多