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

У меня есть следующая модель 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"?

Спасибо


person password636    schedule 07.11.2018    source источник


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

person predi    schedule 08.11.2018
comment
ваше объяснение определения оператора списка очень ясно, и это ключ к пониманию для меня. Не могли бы вы подробнее объяснить There is always only one parent for any given node and in your case that would be the list instance that has both siblings mentioned before as children.? Я не понимаю значения that has both siblings mentioned before as children. - person password636; 09.11.2018
comment
и не могли бы вы взглянуть на этот пост: заголовок stackoverflow.com/questions/52946437/, у меня есть дополнительный вопрос в моем последнем комментарии. Спасибо. - person password636; 09.11.2018
comment
@ password636, я отредактировал ту часть, о которой вы спрашивали. - person predi; 09.11.2018