我有一个XSLT,其中要求是动态选择的'Master'XSLT。此"主" XSLT输出电子邮件的HTML标头信息,但该标头根据某些条件而变化(pst:clientemailtemplate,在下面的示例中(。
问题是不可能具有以下内容(因为XSL:Inclups在XSL:模板中(。因此,这是一种鸡蛋的情况。
解决此问题的最佳方法是什么,因此我可以拥有一个动态选择的输入XSLT,该输入由数据传入到手头的XSLT?
?<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="msxsl pst" xmlns:pst="http://example.com/services/types">
<xsl:template match="pst:TemplateContainer">
<xsl:include href="{/pst:TemplateContainer/pst:Client/pst:ClientEmailTemplate}"/>
<p>My Output text</p>
<p>View the request <a href="{/pst:TemplateContainer/pst:Client/pst:ClientAdminUrl}/group/requests">Admin control panel</a>.</p>
</xsl:template>
</xsl:stylesheet>
解决此问题的最佳方法是什么,所以我可以动态地拥有一个 可选的输入XSLT由数据输入到XSLT控制 手头?
好吧,不是您对动态执行的xsl:include
的发明很明显。与大多数现代编程语言一样,XSLT不允许程序在运行时进行修改。
这里的一种方法是通过不同语言控制的某种管道,例如Java或Xproc或XMLSH;控制程序使用XPATH表达式评估/pst:TemplateContainer/pst:Client/pst:ClientEmailTemplate
,然后发射适当的转换。
使用XSLT 3.0,您可以在XSLT中编写控制程序,因为您可以使用fn:transform((函数动态启动转换。您可能会在某些非3.0处理器中使用供应商扩展来实现相同的效果。
另一种方法(在您的情况下,这是多么可行(是将所有可能的转换组装成单个XSLT样式表,也许每个模式都使用不同的模式,然后动态选择此样式表的哪一部分执行。