В моем понимании есть выражения, которые действительны как 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()]');
делает использование the end()
function определенным в XSLPattern
языке и в качестве таких работ хорошо до тех пор, пока язык выбора 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 поддерживает только сравнение чисел и автоматически преобразует аргументы этого типа.