относительный путь выражения xpath внутри списка YANG - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующая модель ЯНГ:

list machines {
                key "name";
                leaf "name" {
                    type string;
                }
                leaf link {
                    type leafref {
                            path "../name";
                    }
                }
}

Предположим, в списке есть три элемента:

"machines" : [
    { "name": "a" },
    { "name": "b" },
    { "name": "c" }
]

Если я хочу установить "link" для элемента b, допустимыми значениями для "link" являются "a", "b", "c" или просто "b"?

Я не нашел ответа в RFC7950 . А в pyangbind можно установить только "b". Но я не уверен, что это правильное поведение.

Если ../name здесь может ссылаться только на "b", каков правильный путь к ссылке "a", "b", "c", то есть всем именам элементов списка?

Если ../name здесь может ссылаться на "a", "b", "c", каков правильный путь только к ссылке "b"?

Спасибо

1 Ответ

0 голосов
/ 08 ноября 2018

RFC7950 говорит о списках:

Оператор "list" используется для определения внутреннего узла данных в Схема дерева. Узел списка может существовать в нескольких экземплярах в данных дерево. Каждый такой экземпляр известен как запись списка.

Несмотря на то, что ваш экземплярный документ в формате JSON, по-видимому, предполагает, что в нем существует только один экземпляр списка machines, на самом деле существует три экземпляра списка. Имя, которое вы выбрали для списка, усугубляет эту путаницу, поскольку рекомендуемое имя для определения списка будет «машиной». Обертывающий контейнер будет иметь форму имени во множественном числе.

В кодировке XML вышеупомянутое становится более очевидным.

<machines>
  <name>a</name>
</machines>
<machines>
  <name>b</name>
</machines>
<machines>
  <name>c</name>
</machines>

Если я хочу установить "ссылку" для элемента b, допустимыми значениями для "ссылки" являются "a", "b", "c" или просто "b"?

Выражение пути leafref является подмножеством XPath. Применяются те же правила, вы просто ограничены в том, что вы можете выбрать с помощью выражения - оно предназначено для выбора одного или нескольких конечных экземпляров. XPath всегда работает с деревом объектов, и это дерево (несколько неловко) определено в RFC7950 - документ ссылается на это дерево как accessible tree и состоит из созданных экземпляров узлов данных (подмножество дерева данных). Это описано в Раздел 6.4.1 .

Помимо доступного дерева, важен также контекстный узел (относительные выражения ссылаются на него неявно). Вот что говорит RFC7950 об узле контекста в вашем примере.

узел контекста - это узел в дереве данных, для которого определен оператор "path"

В вашем случае это будет экземпляр link, родственный экземпляру name со значением b. Вот краткое дерево псевдоданных:

machines[1]
 +-name(a)
machines[2]
 +-name(b)
 +-link
machines[3]
 +-name(c)

Выражение сначала переходит к выбору родителя link. Всегда есть только один родительский элемент для любого данного экземпляра узла данных, и в вашем случае это будет экземпляр списка, в котором оба родных элемента упоминаются как дочерние элементы (machines[2]). Затем выражение переходит к выбору дочерних элементов с именем name, которое является экземпляром name со значением b.

Это означает, что единственное допустимое значение для вашего link узла - b. Это относится только к вашему конкретному примеру.

Если ../name здесь может ссылаться только на "b", каков правильный путь для ссылки на "a", "b", "c", то есть на все имена элементов списка?

Используйте абсолютное выражение или перейдите на одного из родителей далее, а затем снова:

  • //machines/name (замените // абсолютным путем к machines)
  • ../../machines/name

Оба из них сначала выберут все экземпляры machines.

Примечание: именно так работает XPath. Другая альтернатива будет применима, если в тексте RFC7950 будет указано «существует только один экземпляр списка с несколькими записями» или что-то в этом духе.

...