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

Евг*_*ний 11 xml xslt msxml cross-platform

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

Jam*_*lak 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>
Run Code Online (Sandbox Code Playgroud)

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


Dim*_*hev 7

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

EXSLT的函数通用:node-set()可以实现为内联Javascript函数,因此可以在任何支持Javascript的浏览器中使用(几乎所有主流浏览器都没有例外).

这项技术最初是由Julian Reschke发现的,在他发布于xsl-list之后,由David Carlisle公布.在David Carlisle博客上还有一个指向测试页面的链接,该页面显示了如此实现的common:node-set()函数是否适用于您选择的浏览器.

总结一下:

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

享受!


Ben*_*Ben 1

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

也许不完全是您正在寻找的答案 - 但它可能是,具体取决于您的问题的背景。;-)