我正在寻找从第一个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”都应该接受完整的输入并对其做一些事情,包括创建一个特殊的命名文件。
在网上搜索解决方案或提示并未成功。 这可能吗? 甚至是明智的?
答案 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文件。使用<something id="a"/>
将另一个样式表作为您正在编写的样式表的一个单独部分;使用xs:include
引入另一个样式表,或者基于您正在编写的样式表,以便您可以覆盖模板。
有关xs:import
vs xs:include
的详细信息,请参阅:
xs:import
vs xs:import
。xsl:use-when
属性,该属性可以添加到xs:include
(或xs:import
或任何其他XSLT指令)。最后,与上述两个维度正交,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>
然后,您可以在其中为每个模式编写模块,并在主样式表中包含/导入它们。