【发布时间】: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