杨的XPath current()

时间:2019-05-30 09:57:48

标签: c xml xpath libxml2 ietf-netmod-yang

这是我对Xpath current() in Yang的后续问题,在前面的讨论之后,我为libxml2实现了自定义函数current(),实现如下所示。该函数在评估Xpath表达式(如:

)时可以按预期工作
var obj = {xxx: ["fsd,das"]}
var mystring = obj.xxx[0];
mystring = mystring.replace('fsd,','');
obj.xxx[0] = mystring;
console.log(obj);

但是,当涉及到更复杂的表达式(例如Xpath表达式“ interface [name = current()/ supporting-interface] / type ='optical'”)时,它似乎无法正常工作。我在current()实现中缺少的任何东西。 下面给出的是我的实现。还有没有办法打印由xmlXPathEvalExpression()API构造的最终Xpath表达式?

leaf test-string {
  type string;
  must "current() > 0";
}

1 个答案:

答案 0 :(得分:1)

.current()在YANG中并不相同,尽管它们在certain situations中可能返回相同的结果。 .的结果随XPath路径步骤(您自己在代码中引用的 current 上下文节点)而变化,而current()始终返回相同的节点,无论在何处它用于同一XPath表达式- initial 上下文节点中。

YANG中XPath表达式的初始上下文节点取决于此表达式相对于YANG模式的定义位置。 RFC7950, Section 6.4.1中的规则和这些规则的组合用于确定初始上下文节点:

  • when语句:
      

    以下将对XPath表达式进行概念上的评估   上下文,以及第6.4.1节中的定义:

         

    o如果“ when”语句是“ augment”语句的子级,则     上下文节点是数据树中扩展的目标节点,如果     目标节点是数据节点。否则,上下文节点是     距目标节点最近的祖先节点,也是数据     节点。如果不存在这样的节点,则上下文节点是根节点。     可访问树在处理期间被临时更改     通过删除XPath表达式的所有实例(如果有的话)     “ augment”语句添加的节点。

         

    o如果“ when”语句是“ uses”,“ choice”或“     “ case”语句,则上下文节点是最接近的祖先     节点到带有“ when”语句的节点,该语句也是数据     节点。如果不存在这样的节点,则上下文节点是根节点。     可访问树在处理期间被临时更改     通过删除XPath表达式的所有实例(如果有的话)     “ uses”,“ choice”或“ case”语句添加的节点。

         

    o如果“ when”语句是任何其他数据定义的子级     语句,在访问过程中临时更改了可访问树     通过替换XPath的所有实例来处理XPath表达式     使用“ when”语句为其定义的数据节点     具有相同名称但无值且无的单个虚拟节点     孩子们。如果不存在这样的实例,则虚拟节点为     临时创建。 上下文节点是该虚拟节点。

         

    RFC7950, Section 7.21.5

  • must语句:
      

    以下将对XPath表达式进行概念上的评估   上下文,以及第6.4.1节中的定义:

         

    o如果“必须”语句是“通知”的子语句     语句,上下文节点是代表     通知在可访问树中。

         

    o如果“必须”语句是“输入”语句的子语句,     上下文节点是表示操作中节点的节点     可访问的树。

         

    o如果“必须”语句是“输出”的子语句     语句,上下文节点是表示操作的节点     在可访问的树中。

         

    o否则,上下文节点是可访问树中的节点     定义了“必须”的语句。

         

    RFC7950, Section 7.5.3

  • path语句:
      

    从概念上讲,“路径” XPath表达式在   除了6.4.1节中的定义之外,还提供以下内容:

         

    o如果在typedef中定义了“ path”语句,则上下文     节点是数据树中的叶或叶列表节点,     引用typedef。

         

    o否则,上下文节点是数据树中的节点     定义了“路径”语句。

         

    RFC7950, Section 9.9.2

所有这些规则都需要实现,以支持标准的YANG XPath,包括current()功能。