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

时间:2008-09-18 12:29:21

标签: xml cross-platform msxml xslt

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

5 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:7)

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

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

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

总结:

  1. 首先去here并阅读说明。
  2. 然后尝试测试页面。特别是,验证它是否适用于IE(这意味着使用MSXML)
  3. 最后,使用代码。
  4. 尽情享受!

答案 2 :(得分:3)

Exslt“应该是”与平台无关的xslt扩展集,但只有各种xslt处理器选择实现它们。

some evidence MSXML实际上支持exsl:node-set(),但我不确定。

old article在MSXML上讨论了an implementation exslt。

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

答案 3 :(得分:1)

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

也许不是你想要的答案 - 但它可能是,取决于你的问题的背景。 ; - )

答案 4 :(得分:0)

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