我有一个xslt,其要求是拥有一个动态选择的' master' XSLT。这位'主人' xslt输出电子邮件的html标头信息,但该标头因特定条件而异(pst:以下示例中的ClientEmailTemplate)。
问题在于,不可能有以下内容(因为xsl:include在xsl:template中)。所以这是鸡蛋情况。
解决这个问题的最佳方法是什么,这样我就可以拥有一个动态可选的输入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>
答案 0 :(得分:1)
解决这个问题的最佳方法是什么,这样我就可以动态地解决这个问题 可选输入xslt由传入xslt的数据控制 在手?
嗯,显然,不是你动态执行的xsl:include
的发明。与大多数现代编程语言一样,XSLT不允许程序在运行时自行修改。
这里的一种方法是使用不同语言控制的某种流水线,例如: Java或XProc或xmlsh;控制程序使用XPath表达式来评估/pst:TemplateContainer/pst:Client/pst:ClientEmailTemplate
,然后触发相应的转换。
使用XSLT 3.0,您可以在XSLT中编写控制程序,因为您可以使用fn:transform()函数动态启动转换。在某些非3.0处理器中,您可以使用供应商扩展来实现相同的效果。
另一种方法(我不知道在你的情况下这是多么可行)是将所有可能的转换组装成单个XSLT样式表,也许每个使用不同的模式,然后动态选择这个样式表的哪个部分到执行。