11

我正在编写一些我想在 linux 和 Windows 下使用的 xlst 文件。在这个文件中,我使用了在 MSXML 和 xsltproc 的不同命名空间中声明的节点集函数(分别为“urn:schemas-microsoft-com:xslt”和“ http://exslt.org/common ”)。是否有任何平台独立的方式使用节点集?

4

5 回答 5

8

您可以使用函数 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>

您甚至可以将此逻辑包装在命名模板中,并使用节点集作为参数调用它。

于 2008-09-18T13:26:47.913 回答
8

是的,有一个很好的通用解决方案

EXSLT的函数common:node-set()可以实现为内联 Javascript 函数,因此可用于任何支持 Javascript 的浏览器(几乎所有主流浏览器无一例外)。

这种技术最初是由Julian Reschke发现的,在他将其发布到xsl-list后,由David Carlisle进行了宣传。在David Carlisle 的博客上,还有一个指向测试页面的链接,该链接显示了这样实现的 common:node-set() 函数是否适用于您选择的浏览器。

总结一下:

  1. 首先去这里阅读解释。
  2. 然后尝试测试页面。特别是,验证它是否适用于 IE(这意味着适用于 MSXML)
  3. 最后,使用代码。

尽情享受吧!

于 2008-12-01T03:45:40.770 回答
3

Exslt “应该是”一组独立于平台的 xslt 扩展,但仅限于各种 xslt 处理器选择实现它们。

一些证据表明 MSXML 实际上确实支持 exsl:node-set(),但我不确定。

有一篇旧文章讨论了基于 MSXML 的 exslt 实现

否则,我认为 function-available() 是你的朋友:)

于 2008-09-18T21:58:34.890 回答
1

Firefox 3 在其客户端 XSLT 处理中实现了节点集(作为 EXSLT 2.0 命名空间改进的一部分)。

也许不是您正在寻找的答案 - 但它可能是,这取决于您的问题的上下文。;-)

于 2008-09-18T12:34:03.157 回答
0

如果没有特别的理由在 Windows 上使用节点集的 msxml 实现,您可以在任何地方使用 exslt,方法是将从http://exslt.org下载的实现包含在您的样式表中,exslt howto描述了所需的步骤。您可以使用“扩展名称空间”方式或“命名模板”方式。

于 2008-09-19T08:41:51.363 回答