1

请假设以下实际 XML 结构(不,我们无法更改)。

<root>
  <master>
    <record>
      <ID>1</ID>
      <Value>One</Value>
    </record>
    <record>
      <ID>2</ID>
      <Value>Two</Value>
    </record>
  </master>
  <detail>
    <record>
      <ID>A</ID>
      <MasterID>1</MasterID>
      <Value>Somevalue a</Value>
    </record>
    <record>
      <ID>B</ID>
      <MasterID>2</MasterID>
      <Value>Somevalue b</Value>
    </record>
    <record>
      <ID>C</ID>
      <MasterID>1</MasterID>
      <Value>Somevalue c</Value>
    </record>
    <record>
      <ID>D</ID>
      <Value>Somevalue d</Value>
    </record>
  </detail>
</root>

首先,我们对 XML 执行 XPath 查询以返回可能的详细记录列表:

detailnodes = doc.documentElement.getElementsByTagName('/root/detail')

然后我们在返回 XML 节点列表中处理每个返回的详细记录,此时我们只需要使用 XPath 表达式根据详细节点中的 MasterID 获取主记录的值。我们不想使用应用程序代码来检索当前记录的 MasterID,然后根据检索到的值创建 XPath 表达式

示例(不是这样的)

for each detailnode in detailnodes do
  masterID = detailnode.ChildNodes['MasterID'].value
  masterValue = detailnode.selectNodes('../master[ID=" + MasterID + "]/Value')[0].value
end

示例(首选方式)

for each detailnode in detailnodes do
  masterValue = detailnode.selectNodes('../master[ID=?MasterID?]/Value')[0].value
end

XPath中的?MasterID?表达式应该返回当前详细节点的 MasterID 值。

这甚至可能使用纯 XPath 表达式......?

编辑 注意:我需要使用 MSXML DOM 来完成这项工作......

4

3 回答 3

0

似乎没有办法使用 MSXML 来做到这一点,所以我需要尝试其他方法来使 X-Path 更加动态,而无需修改特定 XML 结构的代码。

于 2017-11-29T09:57:02.560 回答
0

是的,您应该能够通过使用current(). 另外,请注意 Xml 索引是基于 1 的,因此您需要使用[1],如下所示:

(//master/record[ID=current()/MasterID]/Value)[1]
于 2017-11-23T13:27:44.980 回答
0

XQuery像这样的

for $r in /root/detail/record 
  return <record>
         {
           <MasterValue>
           {
             /root/master/record[(ID/text())[1]=($r/MasterID/text())[1]]/Value/text()
           }
           </MasterValue> 
           | $r/*
           }
        </record>

将返回

<record>
   <ID>A</ID>
   <MasterID>1</MasterID>
   <Value>Somevalue a</Value>
   <MasterValue>One</MasterValue>
</record>
<record>
   <ID>B</ID>
   <MasterID>2</MasterID>
   <Value>Somevalue b</Value>
   <MasterValue>Two</MasterValue>
</record>
<record>
   <ID>C</ID>
   <MasterID>1</MasterID>
   <Value>Somevalue c</Value>
   <MasterValue>One</MasterValue>
</record>
<record>
   <ID>D</ID>
   <Value>Somevalue d</Value>
   <MasterValue/>
</record>
于 2017-11-23T13:33:04.500 回答