XPATH向后兼容XSLPattern

时间:2014-11-10 16:07:27

标签: c++ xml xpath msxml

据我了解,所有XSLPattern查询都与XPath查询完全相同,但不一定相反。任何人都可以确认这一点,或者是否有人有一些链接到某些证实这一点的Microsoft文档?

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

1 个答案:

答案 0 :(得分:0)

根据我的理解,有些表达式作为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()]');

使用XSLPattern语言中定义的the end() 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仅支持数字比较并自动将参数转换为该类型。