Xpath适用于“MSXML2.DOMDocument”但不适用于“MSXML2.DOMDocument60”

时间:2011-02-01 16:55:26

标签: xml vba xpath domdocument

  

可能重复:
  String greater, less, and equal comparison in XmlDocument

您好, 在VBA中,我有以下表达式:

 SourceXml.selectNodes("//Races/Race[/FirstRun[@ActStart>'2011-03-01' or
 @ActEnd<'2011-03-15']]")

如果我将SourceXml定义为MSXML2.DOMDocument,它将检索包含所需节点的列表。 如果我将SourceXml定义为MSXML2.DOMDocument60,它将检索一个包含0个元素的列表。

Xpath表达式出了什么问题?

1 个答案:

答案 0 :(得分:5)

您提供的表达

//Races/Race[/FirstRun[@ActStart>'2011-03-01' or  ActEnd<'2011-03-15']]

不会选择任何节点,因为在XPath 1.0中,字符串没有><比较运算符(仅适用于数字)。上面的两个字符串首先转换为数字,产生NaN,涉及NaN的任何比较都是false()。因此,谓词的值为false(),表达式不会选择任何节点。

使用MSXML2.DOMDocument.SelectNodes()选择节点的事实是因为在这个MSXML的早期版本中,默认选择语言不是XPath ,而是称为“XSL”(如果我记得很清楚)并且它不是标准的W3C XPath语言。

我想MSXML6不再提供这种过时的方言。

在您的情况下,您可以成功使用此XPath表达式

//Races/Race[/FirstRun
              [translate(@ActStart,'-','') > 20110301 
             or
               translate(ActEnd, '-','') < 20110315
              ]
            ]