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 节点 ReferenceTypeHasComponent 并且 IsForwardfalse,从那里,向上一级找到 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.