Текущий XPath () для Ян - PullRequest
       35

Текущий XPath () для Ян

2 голосов
/ 30 мая 2019

Это мой дополнительный вопрос для Xpath current () в Yang После предыдущего обсуждения я реализовал настраиваемую функцию current () для libxml2 с реализацией, показанной ниже.Функция работает нормально, как и ожидалось, когда она оценивает выражения Xpath, такие как:

leaf test-string {
  type string;
  must "current() > 0";
}

Но когда используются более сложные выражения, такие как выражение Xpath "interface [name = current () / support-interface] / type = 'optical«», похоже, не работает нормально.Все, что мне не хватает в текущей () реализации.Ниже приведена моя реализация.Также есть способ напечатать окончательное выражение 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");
}

1 Ответ

1 голос
/ 31 мая 2019

. и current() не совпадают в YANG, хотя они могут возвращать один и тот же результат в определенных ситуациях . Результат . изменяется с шагами пути XPath (текущий контекстный узел , как вы сами ссылаетесь в своем коде), в то время как current() всегда возвращает один и тот же узел, независимо от того, где он используется в то же выражение XPath - начальный контекстный узел .

Начальный контекстный узел для выражения XPath в YANG зависит от того, где это выражение определено относительно схемы YANG. Комбинация правил в RFC7950, раздел 6.4.1 , и они используются для определения начального узла контекста:

  • when заявление:

    Выражение XPath концептуально оценивается в следующем контекст, в дополнение к определению в разделе 6.4.1:

    o Если выражение «когда» является потомком оператора «дополнения», то узел контекста является целевым узлом дополнения в дереве данных, если целевой узел является узлом данных. В противном случае узел контекста ближайший узел предка к целевому узлу, который также является данными узел. Если такого узла не существует, узел контекста является корневым узлом. Доступное дерево предварительно изменяется во время обработки выражения XPath, удалив все экземпляры (если есть) узлы, добавленные оператором "augment".

    o Если выражение «когда» является дочерним по отношению к «использует», «выбор» или оператор case, тогда узел контекста является ближайшим предком узел к узлу с оператором «когда», который также является данными узел. Если такого узла не существует, узел контекста является корневым узлом. Доступное дерево предварительно изменяется во время обработки выражения XPath, удалив все экземпляры (если есть) узлы, добавленные с помощью операторов «using», «choice» или «case».

    o Если выражение «когда» является потомком любого другого определения данных утверждение, доступное дерево предварительно изменено обработка выражения XPath путем замены всех экземпляров узел данных, для которого оператор «когда» определен с один фиктивный узел с тем же именем, но без значения и без дети. Если такого экземпляра не существует, фиктивный узел предварительно создан. Узел контекста является этим фиктивным узлом.

    RFC7950, раздел 7.21.5

  • must оператор:

    Выражение XPath концептуально оценивается в следующем контекст, в дополнение к определению в разделе 6.4.1:

    o Если заявление "must" является подстановкой "извещения" оператор узел контекста является узлом, представляющим уведомление в доступном дереве.

    o Если оператор "must" является подстановкой оператора "input", узел контекста является узлом, представляющим операцию в доступное дерево.

    o Если оператор "must" является подзаголовком "output" оператор, узел контекста является узлом, представляющим операцию в доступном дереве.

    o В противном случае узел контекста является узлом в доступном дереве для который определяется оператором "must".

    RFC7950, раздел 7.5.3

  • path оператор:

    XPath-выражение «путь» концептуально оценивается в следующий контекст, в дополнение к определению в разделе 6.4.1:

    o Если оператор "path" определен в typedef, контекст узел - это листовой или листовой узел в дереве данных, который ссылается на typedef.

    o В противном случае узел контекста является узлом в дереве данных, для которого оператор "путь" определен.

    RFC7950, раздел 9.9.2

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

...