如何以独立于平台的方式使用节点集功能?

时间:2020-03-06 14:21:03  来源:igfitidea点击:

我正在写一些我想在Linux和Windows下使用的xlst文件。
在此文件中,我使用节点集函数,该函数在MSXML和xsltproc的不同命名空间中声明(分别为" urn:schemas-microsoft-com:xslt"和" http://exslt.org/common")。有没有平台独立的使用节点集的方式?

解决方案

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

可能不是我们要找的答案,但是可能会有所不同,具体取决于问题的背景。 ;-)

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

我们甚至可以将此逻辑包装在命名模板中,并使用nodeset作为参数来调用它。

Exslt被"假定为"一组独立于平台的xslt扩展,​​但仅在各种xslt处理器选择实现它们的范围内。

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

有一篇旧文章讨论了在MSXML之上的exslt的实现。

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

如果没有特殊原因在Windows上使用节点集的msxml实现,则可以在各处使用exslt,通过将http://exslt.org下载的实现包含在样式表中,exslt如何描述所需的步骤。我们可以使用"扩展名称空间"方式或者"命名模板"方式。

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

EXSLT的函数common:node-set()可以作为内联Javascript函数实现,因此可在任何支持Javascript的浏览器中使用(实际上,所有主流浏览器均无例外)。

这项技术是由朱利安·雷施克(Julian Reschke)首次发现的,并在将其发布到xsl-list上后,由戴维·卡莱尔(David Carlisle)进行了宣传。在David Carlisle的博客上,还有一个指向测试页的链接,该链接显示了这样实现的common:node-set()函数是否与我们选择的浏览器一起使用。

总结一下:

  • 首先去这里阅读说明。
  • 然后尝试测试页。特别是,验证它是否与IE兼容(即与MSXML兼容)
  • 最后,使用代码。

享受吧!