从xsl:template-match中调用xsl:include

时间:2017-06-02 15:10:51

标签: xslt

我有一个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>

1 个答案:

答案 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样式表,也许每个使用不同的模式,然后动态选择这个样式表的哪个部分到执行。