2005-04-11

Javascript: Using XPath as an XML query tool

Long story short: Mozilla: sure. IE / MSXML2 (3.0): well, given a strong stomach, perhaps.

I've been toying with a set top box user interface at work for some time now, all HTML, images, CSS and Javascript. Very non-web, non-computer feely, remote control rules all sort of thing. The target environment is very slightly spiced-up OEM, run of the mill wintel machines, IE the browser to run it on. I'm not overly happy about that last bit.

My development environment is rather Mozilla bound, mostly because there are tools useful when debugging and because IE6 gets error messages wrong, lacks the toSource method and lots of other very useful things that add up to make it a really unfriendly, sluggish environment providing no leverage.

On adding an EPG system to this beast, I decided on using the XMLTV format for the data, and threw together some sketchy parsing using the XPathEvaluator APIs kindly provided by the Mozilla people. It worked beautifully -- here's a comfy sample:

function query_xpath( node, xpath )
{
var document = node.ownerDocument || node;
var evaluator = new XPathEvaluator(), ANY = XPathResult.ANY_TYPE;
var resolver = evaluator.createNSResolver( document.documentElement );
return document.evaluate( path, node, resolver, ANY, null );
}

with which I count nodes matching some given criterion or criteria, for instance - or any other xpath functions. I did this happily enough and left the IE bit for later. Bad move. Do you think I'd be given that freedom with MSXML? I did. I am not there yet, after several hours of reading MSDN and net resources; as it turns out, to do anything but node set operations you must add some XSLT indirection to the brew, I gathered from an MSXML based tool page not kindly enclosing the only interesting bits: source code. Most annoying of them to mark it up well to get google hits from poor sods trying to get MSXML to cooperate, in my grumpy opinion.

This might be on the right track though, should I choose to still rely on doing any XPath based queries on the raw XMLTV data (untested):

function query_xpath( node, xpath )
{
var xsl = new ActiveXObject( 'Msxml2.FreeThreadedDOMDocument.3.0' );
xsl.loadXML('<xsl:stylesheet><xsl:template match="/"><xsl:value-of '+
'select="'+ path +'"/></xsl:template></xsl:stylesheet>');
var xslt = new ActiveXObject( 'Msxml2.XSLTemplate.3.0' );
xslt.stylesheet = xsl;
var xml = node.ownerDocument || node;
var proc = xslt.createProcessor();
proc.input = xml;
proc.transform();
return proc.output;
}

Not pretty. Doesn't comply with the API of processing a node set only, but rather needs the entire document, and it reeks of needless computron waste.

End of rant. I feel a little better already.
Categories: