XML Master/detail master 和 detail 是 XML 中单独的数据集时的数据选择

XML Master/detail data selection when master and detail are separate dataset inside the XML

请假定以下实际 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 到 return 可能的详细记录列表执行 XPath 查询:

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

然后我们处理每个returned detailrecord in the return XML nodelist,此时我们需要使用一个基于detailnode中MasterID的主记录的值仅限 XPath 表达式。 我们不想使用应用程序代码来检索当前记录的 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? 表达式应该 return 当前 detailnode 的 MasterID 值。

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

编辑 注意:我需要使用 MSXML DOM...

来让它工作

是的,您应该能够使用 current() 在 Xml 文档的其他地方查找值,这些值由当前范围内的数据键入。另外,请注意 Xml 索引是基于 1 的,因此您需要使用 [1],如下所示:

(//master/record[ID=current()/MasterID]/Value)[1]

像这样的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>

会return

<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>

似乎无法使用 MSXML 执行此操作,因此我需要尝试其他方法来使 X-Path 更加动态,而无需针对特定 [=12] 修改代码=]-结构。