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仁。如果不存在这样的实例,则虚拟节点是
暂定创建。 上下文节点就是这个虚拟节点。
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 否则,上下文节点 是可访问树中的节点
其中定义了“必须”语句。
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 否则,上下文节点 是数据树中的节点
“路径”语句已定义。
为了支持标准的 YANG XPath,需要实施所有这些规则,包括 current()
功能。
这是我对 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 中是不一样的,尽管它们在 .
的结果随 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仁。如果不存在这样的实例,则虚拟节点是 暂定创建。 上下文节点就是这个虚拟节点。
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 否则,上下文节点 是可访问树中的节点 其中定义了“必须”语句。
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 否则,上下文节点 是数据树中的节点 “路径”语句已定义。
为了支持标准的 YANG XPath,需要实施所有这些规则,包括 current()
功能。