首页 > 解决方案 > 杨的 XPath current()

问题描述

这是我在 Yang 中对 Xpath current() 的后续问题在前面的讨论之后,我为 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");
}

标签: cxmlxpathlibxml2ietf-netmod-yang

解决方案


.并且current()在 YANG 中不一样,尽管在某些情况下它们可能会返回相同的结果。.XPath 路径步骤更改的结果(当前上下文节点,正如您自己在代码中所指的那样),而current()无论它在同一 XPath 表达式中的何处使用,始终返回相同的节点 -初始上下文节点。

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

  • when陈述:

除了第 6.4.1 节中的定义外,XPath 表达式在以下上下文中进行概念评估:

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

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

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

RFC7950,第 7.21.5 节

  • must陈述:

除了第 6.4.1 节中的定义外,XPath 表达式在以下上下文中进行概念评估:

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

o 如果“must”语句是“input”语句的子语句, 则上下文节点是表示可访问树中的操作的节点。

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

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

RFC7950,第 7.5.3 节

  • path陈述:

除了第 6.4.1 节中的定义外,“路径”XPath 表达式在以下上下文中进行概念评估:

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

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

RFC7950,第 9.9.2 节

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


推荐阅读