Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use node-set function in a platform-independent way?

I'm writing some xlst file which I want to use under linux and Windows. In this file I use node-set function which declared in different namespaces for MSXML and xsltproc ("urn:schemas-microsoft-com:xslt" and "http://exslt.org/common" respectively). Is there any platform independent way of using node-set?

like image 675
Евгений Avatar asked Sep 18 '08 12:09

Евгений


4 Answers

Yes, there is a good and universal solution.

EXSLT's function common:node-set() can be implemented as an inline Javascript function and is thus available with any browser that supports Javascript (practically all major browsers without exception).

This technique was first discovered by Julian Reschke and after he published it on the xsl-list, was publicized by David Carlisle. On the blog of David Carlisle there is also a link to a test page that shows if the common:node-set() function thus implemented works with the browser of your choice.

To summarize:

  1. First go here and read the explanation.
  2. Then try the test page. In particular, verify that it works with IE (that means with MSXML)
  3. Finally, use the code.

Do enjoy!

like image 123
Dimitre Novatchev Avatar answered Oct 28 '22 13:10

Dimitre Novatchev


You can use the function function-available() to determine which function you should use:

<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>

You can even wrap this logic in a named template and call it with the nodeset as a parameter.

like image 33
James Sulak Avatar answered Oct 28 '22 14:10

James Sulak


Exslt is "supposed to be" a platform-independent set of xslt extensions, but only so far as various xslt processors choose to implement them.

There's some evidence that MSXML actually does support exsl:node-set(), but I don't know for sure.

There is an old article discussing an implementation of exslt on top of MSXML.

Otherwise, I think function-available() is your friend :)

like image 24
ykaganovich Avatar answered Oct 28 '22 13:10

ykaganovich


Firefox 3 implements node-set (as part of the EXSLT 2.0 namespace improvements) in it's client-side XSLT processing.

Maybe not quite the answer you were looking for - but it could be, depending on the context of your problem. ;-)

like image 25
Ben Avatar answered Oct 28 '22 12:10

Ben