在evaluate()方法的语法中,你将看到一个对命名空间解析器的引用。命名空间解析器(namespace resolver)是一个将XPath表达式中命名空间前缀解析成命名空间URI的函数。该命名空间解析器函数可以由你自行命名,但是要求传入一个字符串参数(需要解析的前缀)。
解析器对参数所提供的前缀进行检查,并返回相关的命名空间URI。为了在IE示例中使用命名空间URI,可以编写下列的解析器:
function nsResolver(sPrefix) {
switch (sPrefix) {
case "na":
return "http://site1.com";
break;
case "pub":
return "http://site2.com";
break;
default:
return null;
break;
}
}
有了上面的解析器,那么就可以在IE命名空间示例中对修改后的books.xml文档使用下列XPath表达式:
var sXPath = "na:book/pub:name";
var oEvaluator = new XPathEvaluator();
var oResult = oEvaluator.evaluate(sXPath,oXmlDom.documentElement,nsResolver,
XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
var aNodes = new Array;
if (oResult != null) {
var oElement;
while (oElement = oResult.iterateNext()) {
aNodes.push(oElement);
}
}
该示例与上一段计算表达式的代码类似。不过,请注意对evaluate()方法的补充:之前编写的nsResolver()函数的指针,作为参数传入evaluate()方法来处理XPath表达式的命名空间。其余部分应该相当熟悉了。使用XPathResult类的iterateNext()方法遍历返回结果NodeList,并转换成数组。
正如你所见,Firefox的XPath实现与微软提供的方法有很大的不同,因此使用一个跨浏览器兼容的库会使得执行XPath计算更加简单。







