我正在编写一些我想在 linux 和 Windows 下使用的 xlst 文件。在这个文件中,我使用了在 MSXML 和 xsltproc 的不同命名空间中声明的节点集函数(分别为“urn:schemas-microsoft-com:xslt”和“ http://exslt.org/common ”)。是否有任何平台独立的方式使用节点集?
5 回答
您可以使用函数 function-available() 来确定应该使用哪个函数:
<xsl:choose>
<xsl:when test="function-available('exslt:node-set')">
<xsl:apply-templates select="exslt:node-set($nodelist)" />
</xsl:when>
<xsl:when test="function-available('msxsl:node-set')">
<xsl:apply-templates select="msxsl:node-set($nodelist)" />
</xsl:when>
<!-- etc -->
</xsl:choose>
您甚至可以将此逻辑包装在命名模板中,并使用节点集作为参数调用它。
是的,有一个很好的通用解决方案。
EXSLT的函数common:node-set()可以实现为内联 Javascript 函数,因此可用于任何支持 Javascript 的浏览器(几乎所有主流浏览器无一例外)。
这种技术最初是由Julian Reschke发现的,在他将其发布到xsl-list后,由David Carlisle进行了宣传。在David Carlisle 的博客上,还有一个指向测试页面的链接,该链接显示了这样实现的 common:node-set() 函数是否适用于您选择的浏览器。
总结一下:
- 首先去这里阅读解释。
- 然后尝试测试页面。特别是,验证它是否适用于 IE(这意味着适用于 MSXML)
- 最后,使用代码。
尽情享受吧!
Exslt “应该是”一组独立于平台的 xslt 扩展,但仅限于各种 xslt 处理器选择实现它们。
有一些证据表明 MSXML 实际上确实支持 exsl:node-set(),但我不确定。
有一篇旧文章讨论了基于 MSXML 的 exslt 实现。
否则,我认为 function-available() 是你的朋友:)
Firefox 3 在其客户端 XSLT 处理中实现了节点集(作为 EXSLT 2.0 命名空间改进的一部分)。
也许不是您正在寻找的答案 - 但它可能是,这取决于您的问题的上下文。;-)
如果没有特别的理由在 Windows 上使用节点集的 msxml 实现,您可以在任何地方使用 exslt,方法是将从http://exslt.org下载的实现包含在您的样式表中,exslt howto描述了所需的步骤。您可以使用“扩展名称空间”方式或“命名模板”方式。