XPath 在双重条件下取元素
XPath take element on double condition
我有一个来自 OPC-UA 的 InformationModel,用 xml (https://github.com/OPCFoundation/UA-Nodeset/blob/v1.04/Robotics/Opc.Ua.Robotics.NodeSet2.xml) 编写。
从这个模型我想:
查看 UAObject 中的引用并仅在引用具有时获取 DisplayName
1)我要找的nodeid
2)有一个字段 IsRecursive="false"
我尝试使用此代码来获取所有对象,该对象的引用指向我指定的 nodeid,并且它有效。
这是它的代码:
var ObjectsName2 = select(
"//ns1:References/ns1:Reference[.=" +
formatted_id + "]/ancestor::ns1:UAObject/ns1:DisplayName/text()",
nodes,
false
);
现在我想使用具有特定 nodeid 且字段 IsForward 设置为“false”的节点。
所以我有一个双重条件需要用 AND 来验证。
这是我正在使用的代码:
var formatted_id = '"' + ParentNodeId + '"';
var negate = "false";
var ObjectsName = select(
"//ns1:References/ns1:Reference[.=" +
formatted_id +
"//@ns1:IsForward="+negate+"]/ancestor::ns1:UAObject/ns1:DisplayName/text()",
nodes,
false
);
错误的结果是一个空数组。
为了使这里更容易理解,这是一个显示我想要的示例。
假设您有这个 xml 条目,而我正在寻找的节点是 ns=1;i=15008:
<UAObject NodeId="ns=1;i=15024" BrowseName="2:ParameterSet" ParentNodeId="ns=1;i=15008">
<DisplayName>ParameterSet</DisplayName>
<Description>Flat list of Parameters</Description>
<References>
<Reference ReferenceType="HasComponent">ns=1;i=15061</Reference>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=15008</Reference>
</References>
</UAObject>
如您所见,有一个名为“HasComponent”的引用指向我的节点 (ns=1;i=15008) 和 IsForward="false"。
预期的输出应该是UAObject在输出数组中的显示名称-->ParameterSet
有人可以帮助我吗?
所以你想找到 Reference
节点 ReferenceType
是 HasComponent
并且 IsForward
是 false
,从那里,向上一级找到 DisplayName
?
const {transform} = require('camaro')
;(async function main() {
const xml = `
<UAObject NodeId="ns=1;i=15024" BrowseName="2:ParameterSet" ParentNodeId="ns=1;i=15008">
<DisplayName>ParameterSet</DisplayName>
<Description>Flat list of Parameters</Description>
<References>
<Reference ReferenceType="HasComponent">ns=1;i=15061</Reference>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=15008</Reference>
</References>
</UAObject>
`
const template = {
names: ['//References/Reference[@ReferenceType="HasComponent" and @IsForward="false"]', '../../DisplayName']
}
console.log(await transform(xml, template), null, 4);
})()
出来
{ names: [ 'ParameterSet' ] }
简单的单独基于xpath,这个表达式:
//Reference[@ReferenceType="HasComponent"][@IsForward="false"]
应该 select ns=1;i=15008
在你的样本中 xml.
我有一个来自 OPC-UA 的 InformationModel,用 xml (https://github.com/OPCFoundation/UA-Nodeset/blob/v1.04/Robotics/Opc.Ua.Robotics.NodeSet2.xml) 编写。 从这个模型我想: 查看 UAObject 中的引用并仅在引用具有时获取 DisplayName 1)我要找的nodeid 2)有一个字段 IsRecursive="false"
我尝试使用此代码来获取所有对象,该对象的引用指向我指定的 nodeid,并且它有效。 这是它的代码:
var ObjectsName2 = select(
"//ns1:References/ns1:Reference[.=" +
formatted_id + "]/ancestor::ns1:UAObject/ns1:DisplayName/text()",
nodes,
false
);
现在我想使用具有特定 nodeid 且字段 IsForward 设置为“false”的节点。 所以我有一个双重条件需要用 AND 来验证。 这是我正在使用的代码:
var formatted_id = '"' + ParentNodeId + '"';
var negate = "false";
var ObjectsName = select(
"//ns1:References/ns1:Reference[.=" +
formatted_id +
"//@ns1:IsForward="+negate+"]/ancestor::ns1:UAObject/ns1:DisplayName/text()",
nodes,
false
);
错误的结果是一个空数组。 为了使这里更容易理解,这是一个显示我想要的示例。
假设您有这个 xml 条目,而我正在寻找的节点是 ns=1;i=15008:
<UAObject NodeId="ns=1;i=15024" BrowseName="2:ParameterSet" ParentNodeId="ns=1;i=15008">
<DisplayName>ParameterSet</DisplayName>
<Description>Flat list of Parameters</Description>
<References>
<Reference ReferenceType="HasComponent">ns=1;i=15061</Reference>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=15008</Reference>
</References>
</UAObject>
如您所见,有一个名为“HasComponent”的引用指向我的节点 (ns=1;i=15008) 和 IsForward="false"。
预期的输出应该是UAObject在输出数组中的显示名称-->ParameterSet 有人可以帮助我吗?
所以你想找到 Reference
节点 ReferenceType
是 HasComponent
并且 IsForward
是 false
,从那里,向上一级找到 DisplayName
?
const {transform} = require('camaro')
;(async function main() {
const xml = `
<UAObject NodeId="ns=1;i=15024" BrowseName="2:ParameterSet" ParentNodeId="ns=1;i=15008">
<DisplayName>ParameterSet</DisplayName>
<Description>Flat list of Parameters</Description>
<References>
<Reference ReferenceType="HasComponent">ns=1;i=15061</Reference>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=15008</Reference>
</References>
</UAObject>
`
const template = {
names: ['//References/Reference[@ReferenceType="HasComponent" and @IsForward="false"]', '../../DisplayName']
}
console.log(await transform(xml, template), null, 4);
})()
出来
{ names: [ 'ParameterSet' ] }
简单的单独基于xpath,这个表达式:
//Reference[@ReferenceType="HasComponent"][@IsForward="false"]
应该 select ns=1;i=15008
在你的样本中 xml.