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] 修改代码=]-结构。
请假定以下实际 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] 修改代码=]-结构。