我正在寻找从第一个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>每个“子xslt”都应该接受完整的输入,并对其执行一些操作,包括创建一个特殊的命名文件。
因为在网络上搜索解决方案或提示并不成功。这有可能做到吗?或者甚至是明智的?
发布于 2016-07-22 20:41:13
,甚至是明智的?
不,考虑以过程化方式调用XSLT是不明智的,但是您提出这个问题是一个好兆头,表明您认识到可能有更好的方法……
模式匹配
不要从“调用”其他XSLT的角度来考虑过程性问题。相反,根据与输入匹配的模式来考虑声明性。
为
<Subject name ="A1" type="a"/>相反,你会认为
if type = "a" call "XSL_A" with above XML-Input想
Subject的@type为"a"时,输出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:include与xs:import的更多详细信息,请参阅:
与xs:include.
xsl:use-when属性,该属性可以添加到xs:import (或xs:include或任何其他XSLT模式
最后,与上述两个维度正交的是,XSLT支持控制模板适用性的模式。有关模式的更多信息,请参见Can one give me the example for “mode” of template in xsl
发布于 2016-07-22 18:52:15
如果真的想动态调用XSLT样式表,那么需要使用带有https://www.w3.org/TR/xpath-functions-31/#func-transform函数的XSLT3.0。另一方面,你用上面的XML-Input发布的if type = "a" call "XSL_A"看起来像是一个可能的基于模板的匹配搜索,另外还有<xsl:template match="Subject[@type = 'a']" mode="a">...</xsl:template>模式,然后你可以为每个模式编写模块,并将它们包含/导入到主样式表中。
https://stackoverflow.com/questions/38524500
复制相似问题