如何从XSLT调用XSLT?

时间:2016-07-22 10:46:00

标签: xml xslt

我正在寻找从第一个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”都应该接受完整的输入并对其做一些事情,包括创建一个特殊的命名文件。

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

2 个答案:

答案 0 :(得分:3)

  

甚至是明智的?

不,考虑在程序上调用XSLT是不明智的,但是你问这个问题是一个好的迹象,表明你认识到可能有更好的方法......

模式匹配

在“调用”其他XSLT方面,不要认为程序性。用 模式匹配 来输入声明

有关

<Subject name ="A1" type="a"/>
而不是思考

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

认为

  • 匹配Subject@type的{​​{1}}时,输出"a"

或者,在XSLT中,

something

这样

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

被翻译为

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

在输出中。

XSLT文件组织

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

有关xs:import vs xs:include的详细信息,请参阅:

模式

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

答案 1 :(得分:1)

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