VBA 代码中 XPATH 查询的语法 select 最小日期值

Syntax for XPATH query in VBA code to select minimum date value

我在 Word VBA(Word 2016,VBA 7.1)中使用 Microsoft XML,v3.0,从 XML 中提取数据SQL 带有 FOR XML 查询的 Server 2008 数据库。

我想提取一个特定的日期,所以我创建了一个 XPath 查询:

xpath = "//XMLPKG/CASE/EVENT[OCCURRED=0][@EVENTNO='23']/DUEDATE"

然后 运行 选择节点:

Set matchingNodes = xmlDoc.SelectNodes(xpath)
If matchingNodes.Length > 0 Then
   dueDate = matchingNodes(0).Text
End If

这很好用,现在我想提取最早的日期,而不是第一个节点的日期。但是我无法让 min() 函数工作。我试过这样:

xpath = "//XMLPKG/CASE/EVENT[OCCURRED=0][@EVENTNO='" & Format$(eventNum, "0") & "']/min(DUEDATE)"

还有这个:

xpath = "min(//XMLPKG/CASE/EVENT[OCCURRED=0][@EVENTNO='" & Format$(eventNum, "0") & "']/DUEDATE)"

但是两种形式都给我一个指向 min() 函数的 "Unknown method" 错误。

这是我的 XML:

的(经过消毒的)版本
<XMLPKG>
    <CASE CASEID="1">
        <EVENT EVENTNO="23">
            <CYCLE>1</CYCLE>
            <DUEDATE>1964-11-04</DUEDATE>
            <OCCURRED>0</OCCURRED>
        </EVENT>
        <EVENT EVENTNO="23">
            <CYCLE>1</CYCLE>
            <DUEDATE>1959-11-04</DUEDATE>
            <OCCURRED>0</OCCURRED>
        </EVENT>
        <EVENT EVENTNO="23">
            <CYCLE>1</CYCLE>
            <EVENTDATE>1954-05-11</EVENTDATE>
            <OCCURRED>1</OCCURRED>
        </EVENT>
        <EVENT EVENTNO="124">
            <CYCLE>1</CYCLE>
            <EVENTDATE>1960-07-01</EVENTDATE>
            <OCCURRED>1</OCCURRED>
        </EVENT>
    </CASE>
</XMLPKG>

我做错了什么?

min() 函数在 MSXML 提供的 XPath 版本 XPath 1.0 中不可用。

I want to extract the earliest date

这在XPath 1.0中是做不到的,它只能比较能成功转换为数字的东西。例如,找出具有最小@EVENTNO 的 EVENT 将像这样工作:

//EVENT[not(@EVENTNO > //EVENT/@EVENTNO)]

对于任意字符串的目标值,有必要按字典顺序对字符串进行比较,这需要整理知识,而这在 XPath 1.0 中不可用。

但是因为 VBA 可以比较字符串,所以我会使用这样的东西:

Dim eventDate As Variant, smallestDate As String

For Each eventDate In xmlDoc.SelectNodes("//EVENT[OCCURRED=0]/EVENTDATE")
   If smallestDate = "" Or eventDate.text < smallestDate Then smallestDate = eventDate.text
Next

MsgBox "Earliest event: " & smallestDate