【问题标题】:How to call XSLT from XSLT?如何从 XSLT 调用 XSLT?
【发布时间】:2016-11-26 05:49:18
【问题描述】:

我正在寻找从第一个 XSLT 调用第二个 XSLT 的可能性。

我的 XML 输入看起来像

<xml>
  <Subject name ="A1" type="a">
  <Subject name ="B2" type="b">
  <Subject name ="C1" type="c">
  <Subject name ="A2" type="a">
  <Subject name ="B1" type="b">
  <Subject name ="C2" type="c">
  <Subject name ="A3" type="a">
</xml>

我想要做的是类似的事情

<xsl>
 if type = "a" call "XSL_A" with above XML-Input
 if type = "b" call "XSL_B" with above XML-Input
 if type = "c" call "XSL_C" with above XML-Input

 Do-Something with above XML-Input
<xsl>

每个“sub-xslt”都应获取完整的输入并对其进行处理,包括创建一个特殊的命名文件。

在网上搜索解决方案或提示没有成功。 这可能吗? 甚至是明智的?

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    如果您真的想动态调用 XSLT 样式表,那么您需要带有 https://www.w3.org/TR/xpath-functions-31/#func-transform 函数的 XSLT 3.0。另一方面,您发布的内容例如if type = "a" call "XSL_A" 与上面的 XML-Input 看起来像是一个可能的基于模板匹配的搜索和额外的模式,例如&lt;xsl:template match="Subject[@type = 'a']" mode="a"&gt;...&lt;/xsl:template&gt; 然后您可以为每种模式编写模块并将它们包含/导入到主样式表中。

    【讨论】:

      【解决方案2】:

      甚至是明智的?

      不,考虑以程序方式调用 XSLT 是不明智的,但您提出这个问题是一个好兆头,表明您认识到可能有更好的方法...

      模式匹配

      不要以“调用”其他 XSLT 的方式程序化。改为以声明方式考虑模式匹配输入。

      对于

      <Subject name ="A1" type="a"/>
      

      换位思考

      • if type = "a" call "XSL_A" with above XML-Input

      想想

      • 匹配@type"a"Subject 时,输出something

      或者,在 XSLT 中,

      <xsl:template match="Subject[@type='a']>
          <something id="{@name}"/>
      </xsl>
      

      这样

      <Subject name ="A1" type="a"/>
      

      被翻译成

      <something id="a"/>
      

      在输出中。


      XSLT 文件组织

      与上述匹配驱动的设计方法正交,可以组织和组合 XSLT 文件。使用xs:include 将另一个样式表作为您正在编写的样式表的单独部分引入;使用xs:import 引入另一个样式表,例如或基于您正在编写的样式表,以便您覆盖模板。

      有关xs:includexs:import 的更多详细信息,请参阅:

      模式

      最后,与上述两个维度正交,XSLT 支持用于控制模板适用性的模式。有关模式的更多信息,请参阅Can one give me the example for “mode” of template in xsl?

      【讨论】:

      • 不错的帖子,我删除了我的帖子以支持你的帖子。我希望 OP 注意到你的。
      • 感谢您的全面回答。事实上,result-documentinclude(s) 的组合对我来说已经完成了这项工作。正如您所说的“不要在程序上思考”可能是 XSLT 的(我的)主要问题。
      猜你喜欢
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2017-05-10
      相关资源
      最近更新 更多