这是我对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";
}
答案 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”语句为其定义的数据节点 具有相同名称但无值且无的单个虚拟节点 孩子们。如果不存在这样的实例,则虚拟节点为 临时创建。 上下文节点是该虚拟节点。
must
语句:
以下将对XPath表达式进行概念上的评估 上下文,以及第6.4.1节中的定义:
o如果“必须”语句是“通知”的子语句 语句,上下文节点是代表 通知在可访问树中。
o如果“必须”语句是“输入”语句的子语句, 上下文节点是表示操作中节点的节点 可访问的树。
o如果“必须”语句是“输出”的子语句 语句,上下文节点是表示操作的节点 在可访问的树中。
o否则,上下文节点是可访问树中的节点 定义了“必须”的语句。
path
语句:
从概念上讲,“路径” XPath表达式在 除了6.4.1节中的定义之外,还提供以下内容:
o如果在typedef中定义了“ path”语句,则上下文 节点是数据树中的叶或叶列表节点, 引用typedef。
o否则,上下文节点是数据树中的节点 定义了“路径”语句。
所有这些规则都需要实现,以支持标准的YANG XPath,包括current()
功能。