调用XSL:从内部XSL:template-Match



我有一个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样式表,也许每个模式都使用不同的模式,然后动态选择此样式表的哪一部分执行。

最新更新