Yang 的 XPath current()

XPath current() for Yang

这是我对 Xpath current() in Yang 的跟进问题 在前面的讨论之后,我为 libxml2 实现了一个自定义函数 current(),其实现如下所示。该函数在评估 Xpath 表达式时按预期工作正常:

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

但是当涉及更复杂的表达式时,如 Xpath 表达式 "interface[name=current()/supporting-interface]/type = 'optical'",它似乎无法正常工作。我在 current() 实现中遗漏的任何内容。 下面给出的是我的实现。还有一种方法可以打印由 xmlXPathEvalExpression() API?

构造的最终 Xpath 表达式
/*
 * ext_current () -- Defines the Xpath extension current(),
 * defined by Yang RFC.
 *
 * From Yang RFC 7950:
 *
 * The current() function takes no input parameters and returns a node
 * set with the initial context node as its only member.
 */
static void
ext_current (xmlXPathParserContextPtr ctxt, int nargs)
{
    /*
     * This function takes 0 args.
     */
    if (nargs != 0) {
        return;
    }

    /* Push the current context node onto Xpath Stack */
    valuePush(ctxt, xmlXPathNewNodeSet(ctxt->context->node));
}

/*
 * register_yang_xpath_extensions () -- Registers extensions defined by Yang
 * RFC.
 */
static void
register_yang_xpath_extensions (xmlXPathContextPtr ctxt)
{
    int rc = 0;

    rc = xmlXPathRegisterFunc(ctxt, (const xmlChar *)"current",
                              ext_current);
    if (rc != 0)
        fprintf(stderr, "Error in registering current() func\n");
}

.current() 在 YANG 中是不一样的,尽管它们在 中可能 return 相同的结果。 . 的结果随 XPath 路径步骤而变化( 当前 上下文节点,正如您自己在代码中所指的那样),而 current() 总是 returns 是相同的节点,无论它在同一 XPath 表达式中的何处使用 - initial 上下文节点。

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

  • when 语句:

The XPath expression is conceptually evaluated in the following context, in addition to the definition in Section 6.4.1:

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

o 如果“when”语句是 child 的“uses”、“choice”或 “case”语句,那么上下文节点是最近的祖先 节点到具有“when”语句的节点也是一个数据 节点。如果不存在这样的节点,上下文节点是根节点。 可访问树在处理过程中被暂时更改 通过删除 XPath 表达式的所有实例(如果有的话) 由“uses”、“choice”或“case”语句添加的节点。

o 如果“when”语句是任何其他数据定义的 child 声明中,可访问树在 通过替换所有实例来处理 XPath 表达式 为其定义了“when”语句的数据节点 具有相同名称但没有值且没有的单个虚拟节点 child仁。如果不存在这样的实例,则虚拟节点是 暂定创建。 上下文节点就是这个虚拟节点。

RFC7950, Section 7.21.5

  • must 语句:

The XPath expression is conceptually evaluated in the following context, in addition to the definition in Section 6.4.1:

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

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

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

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

RFC7950, Section 7.5.3

  • path 语句:

The "path" XPath expression is conceptually evaluated in the following context, in addition to the definition in Section 6.4.1:

o 如果“路径”语句是在 typedef 中定义的,上下文 node 是数据树中的叶节点或 leaf-list 节点 引用 typedef。

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

RFC7950, Section 9.9.2

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