【问题标题】:XPath current() for Yang杨的 XPath current()
【发布时间】:2019-05-30 09:57:48
【问题描述】:

这是我对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");
}

【问题讨论】:

  • 我不了解 libxml2 的任何详细信息,但我怀疑您正在寻找的值(XPath 表达式最外层的上下文项的项)无法通过此 API 获得.没有理由这样做,因为它不是 XPath 动态上下文的定义部分,XPath 中没有任何东西使用它。您正在返回上下文项,您可以使用“.”获得同样的效果。
  • 谢谢,根据 Yang RFC 10.1。节点集的功能 10.1.1。 current() 节点集 current() current() 函数不接受输入参数,并返回一个节点集,其中初始上下文节点作为其唯一成员。我使用它作为参考和参考实现:w3schools.com/xml/func_current.asp
  • 但不确定为什么 Yang RFC 必须定义一个名为 current() 的新扩展名,而两者都是“.”。和 current() 是一样的。
  • "。"和 XSLT 中的 "current()" 绝对不一样。 (如果您需要知道精确的语义,那么请远离旨在易于理解而不是精确准确性的 w3schools)。

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


【解决方案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 表达式 “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 中定义,上下文 node 是数据树中的叶子或叶子列表节点, 引用 typedef。

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

RFC7950, Section 9.9.2

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

【讨论】:

    猜你喜欢
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多