据我了解,所有XSLPattern查询都将与XPath查询相同地工作,但不一定相反。任何人都可以确认这一点,或者有人可以链接到某些Microsoft文档来确认这一点吗?

在我管理的某些代码的各个部分中,我已经将MSXML文档的选择语言更改为XPath,我只想确保我不会破坏最初作为XSLPattern查询编写的查询。

最佳答案

在我的理解中,有些表达式可以作为XSLPattern有效,并且可以与selectNodes/selectSingleNode一起执行,但是当作为XPath 1.0表达式执行时会引发错误。例如例子

var doc = new ActiveXObject('Msxml2.DOMDocument.3.0');
doc.loadXML('<root><item>1</item><item>2</item></root>');
var item = doc.selectSingleNode('root/item[end()]');
WScript.Echo(item.xml);

doc.setProperty('SelectionLanguage', 'XPath');
item = doc.selectSingleNode('root/item[end()]');

使用end()语言中定义的the XSLPattern function,因此只要选择语言是XSLPattern,它就可以正常工作,但是由于XPath 1.0中没有这样的功能,因此在最后一行抛出异常,您将其写为root/item[position() = last()]

因此,有些XSLPattern表达式不能用作XPath 1.0表达式。也有导致不同结果的表达式,例如
var doc = new ActiveXObject('Msxml2.DOMDocument.3.0');
doc.loadXML('<root><item>1</item><item>2</item><item>12</item></root>');
var expression = 'root/item[. > "10"]';
var item = doc.selectSingleNode(expression);
WScript.Echo(item.xml);

doc.setProperty('SelectionLanguage', 'XPath');
item = doc.selectSingleNode(expression);
WScript.echo(item.xml);

哪个输出
<item>2</item>
<item>12</item>

似乎XSLPattern使基于字符串的>大于比较,而XPath 1.0仅支持数字比较并自动将参数转换为该类型。

09-08 08:43