在XSLT导入/include中使用动态href



<xsl:import><xsl:include>元素的行为似乎非常特定。我想做的事:

<xsl:import href="{$base}/themes/{/settings/active_theme}/styles.xsl" />

我想允许为我的应用程序加载不同的主题。我的应用程序中有一个设置,它将"当前活动主题"文件夹名称存储在xml节点中。不幸的是,上面的代码不起作用。有人知道实现我想做的事情的变通方法吗?

编辑:刚刚通过Twitter与一位XSLT专家确认。。。没有什么好办法做到这一点。在我的情况下,最简单的解决方案可能是分离前端和后端样式表,并将它们单独加载到XSLTProcessor。。。

xsl:import在执行前组装样式表。样式表在执行时不能修改自己,这正是您试图实现的。

如果您有三种样式表变体可在不同的环境中使用,由三个模块a.xsl、B.xsl和C.xsl表示,那么您不需要尝试将其中一个导入到包含所有公共代码的模块common.xsl中,而是需要颠倒结构:a.xsl和B.xsl中的每一个都应该导入common.xsl,或者在启动转换时将C.xsl作为主要样式表模块。

我想做的事:

<xsl:import href="{$base}/themes/{/settings/active_theme}/styles.xsl" />

这在XSLT的任何版本(1.0、2.0或3.0)中都是不允许的

在XSLT2.0(及更高版本)中,可以使用use-when属性,但可以指定的条件非常有限。

一个非XSLT解决方案是将导入的XSLT样式表加载为XmlDocument,并使用DOM API将href属性设置为真正需要的值,然后才调用转换。

最新更新