Это мой дополнительный вопрос для Xpath current() в Ян. После предыдущего обсуждения я реализовал настраиваемую функцию current() для libxml2 с реализацией, показанной ниже. Функция работает нормально, как и ожидалось, когда она оценивает выражения Xpath, такие как:
leaf test-string {
type string;
must "current() > 0";
}
Но когда используются более сложные выражения, такие как выражение Xpath «interface[name=current()/supporting-interface]/type = ‘optical’», кажется, что это не работает нормально. Все, что мне не хватает в реализации current(). Ниже приведена моя реализация. Также есть ли способ напечатать окончательное выражение Xpath, которое создается с помощью API xmlXPathEvalExpression()?
/*
* 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");
}
Спасибо, согласно Ян RFC 10.1. Функция для наборов узлов 10.1.1. current() node-set current() Функция current() не принимает входных параметров и возвращает набор узлов с начальным узлом контекста в качестве единственного члена. Я реализовал, используя это как ссылку и ссылаясь: w3schools.com/xml/func_current.asp
Но не уверен, почему Ян RFC должен был определить новое расширение с именем current (), когда оба «.» и текущий () одинаковы.
"." и "current()" в XSLT определенно НЕ совпадают. (И если вам нужно знать точную семантику, держитесь подальше от w3schools, целью которого является простота понимания, а не точная точность).
.
и current()
не совпадают в YANG, хотя они могут возвращать один и тот же результат в определенные ситуации. Результат .
изменяется с шагами пути XPath (узел контекста ток, как вы сами указываете в своем коде), в то время как current()
всегда возвращает один и тот же узел независимо от того, где он используется в одном и том же выражении XPath — узел контекста исходный.
Начальный узел контекста для выражения XPath в YANG зависит от того, где это выражение определено относительно схемы YANG. Комбинация правил в RFC7950, раздел 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 Если оператор «когда» является потомком оператора «расширить», то узел контекста — целевой узел дополнения в дереве данных, если целевой узел является узлом данных. В противном случае узел контекста ближайший узел-предок к целевому узлу, который также является данными узел. Если такой узел не существует, узел контекста является корневым узлом. Доступное дерево предварительно изменяется во время обработки выражения XPath, удалив все экземпляры (если есть) узлы, добавленные оператором "augment".
o Если оператор «когда» является потомком оператора «использует», «выбор» или оператор case, то узел контекста является ближайшим предком узел к узлу с оператором «когда», который также является данными узел. Если такой узел не существует, узел контекста является корневым узлом. Доступное дерево предварительно изменяется во время обработки выражения XPath, удалив все экземпляры (если есть) узлы, добавленные оператором «uses», «choice» или «case».
o Если оператор «когда» является дочерним элементом любого другого определения данных заявление, доступное дерево предварительно изменено во время обработка выражения XPath путем замены всех экземпляров узел данных, для которого оператор «когда» определен с помощью один фиктивный узел с тем же именем, но без значения и без дети. Если такого экземпляра не существует, фиктивный узел предварительно создан. Контекстный узел — это фиктивный узел.
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 Если оператор "path" определен в typedef, контекст узел является конечным узлом или узлом листового списка в дереве данных, которое ссылается на typedef.
o В противном случае узел контекста является узлом в дереве данных, для которого оператор "путь" определен.
Все эти правила должны быть реализованы для поддержки стандартного YANG XPath, включая функцию current()
.
Я не знаком с libxml2 в деталях, но подозреваю, что значение, которое вы ищете (элемент, который был элементом контекста на самом внешнем уровне выражения XPath), недоступно через этот API. Нет причин, по которым это должно быть, потому что это не определенная часть динамического контекста XPath, и ничто в XPath не использует его. Вы возвращаете элемент контекста, который вы можете получить с таким же успехом, используя «.».