XPath current() для Ян

Это мой дополнительный вопрос для 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");
}

Я не знаком с libxml2 в деталях, но подозреваю, что значение, которое вы ищете (элемент, который был элементом контекста на самом внешнем уровне выражения XPath), недоступно через этот API. Нет причин, по которым это должно быть, потому что это не определенная часть динамического контекста XPath, и ничто в XPath не использует его. Вы возвращаете элемент контекста, который вы можете получить с таким же успехом, используя «.».

Michael Kay 30.05.2019 15:57

Спасибо, согласно Ян RFC 10.1. Функция для наборов узлов 10.1.1. current() node-set current() Функция current() не принимает входных параметров и возвращает набор узлов с начальным узлом контекста в качестве единственного члена. Я реализовал, используя это как ссылку и ссылаясь: w3schools.com/xml/func_current.asp

Ram 30.05.2019 16:06

Но не уверен, почему Ян RFC должен был определить новое расширение с именем current (), когда оба «.» и текущий () одинаковы.

Ram 30.05.2019 16:15

"." и "current()" в XSLT определенно НЕ совпадают. (И если вам нужно знать точную семантику, держитесь подальше от w3schools, целью которого является простота понимания, а не точная точность).

Michael Kay 30.05.2019 20:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
1 204
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

. и 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 путем замены всех экземпляров узел данных, для которого оператор «когда» определен с помощью один фиктивный узел с тем же именем, но без значения и без дети. Если такого экземпляра не существует, фиктивный узел предварительно создан. Контекстный узел — это фиктивный узел.

RFC7950, раздел 7.21.5

  • 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 В противном случае узел контекста является узлом в доступном дереве для которым определено выражение «должен».

RFC7950, раздел 7.5.3

  • 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 В противном случае узел контекста является узлом в дереве данных, для которого оператор "путь" определен.

RFC7950, раздел 9.9.2

Все эти правила должны быть реализованы для поддержки стандартного YANG XPath, включая функцию current().

Другие вопросы по теме