Относительный путь выражения xpath внутри списка YANG

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

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 ответ

Решение

Вот что говорит 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 об узле контекста в вашем примере.

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

Это было бы 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 будет указано "существует только один экземпляр списка с несколькими записями" или что-то в этом духе.

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