Вот что 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 будет сказано «есть только один экземпляр списка с несколькими записями» или что-то в этом роде.
person
predi
schedule
08.11.2018