我正在编写一些我想在linux和Windows下使用的xlst文件。 在这个文件中,我使用了node-set函数,该函数在不同的命名空间中为MSXML和xsltproc(分别为“urn:schemas-microsoft-com:xslt”和“http://exslt.org/common”)声明。是否有任何平台独立的方式使用节点集?
答案 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()函数是否适用于您选择的浏览器。
总结:
尽情享受!
答案 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描述了所需的脚步。您可以使用“扩展命名空间”方式或“命名模板”方式。