如何从 XSLT 调用 XSLT?

sus*_*usi 3 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>
Run Code Online (Sandbox Code Playgroud)

我想做的是

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

kjh*_*hes 5

甚至是明智的?

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

模式匹配

不要从“调用”其他 XSLT 的角度考虑程序。而是根据输入的模式匹配进行声明式思考。

为了

<Subject name ="A1" type="a"/>
Run Code Online (Sandbox Code Playgroud)

而是思考

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

思考

  • 当匹配一个Subjectwho @typeis 时"a",输出something

或者,在 XSLT 中,

<xsl:template match="Subject[@type='a']>
    <something id="{@name}"/>
</xsl>
Run Code Online (Sandbox Code Playgroud)

以便

<Subject name ="A1" type="a"/>
Run Code Online (Sandbox Code Playgroud)

被翻译成

<something id="a"/>
Run Code Online (Sandbox Code Playgroud)

在输出中。


XSLT 文件组织

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

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

模式

最后,与上述两个维度正交,XSLT 支持控制模板适用性的模式。有关模式的更多信息,请参阅可以给我一个 xsl 中模板“模式”的示例吗?