Ян модель рекурсивного поиска должен условие - PullRequest
0 голосов
/ 17 января 2019

У меня проблема с ограничением моего CLI. Я расследовал Ян RFC7950 (https://tools.ietf.org/html/rfc7950), но ничего не нашел.

Вот пример.

grouping httpGroup {
  list http-list{
    key "value";
    leaf value {
      status current { yexte:preliminary; }
      description "value to match";
      must "(not(../protocol)) and (not(../network-port)))" {
        error-message "Not compatible with protocol or non-TCP ports";
      }
      type string { length "1..255"; }
    }
  }
}

Эта группа будет включена в несколько групп со следующей структурой:

list and {
  leaf-list protocol { ..... }
  uses A;
  list or { 
    leaf-list protocol { ..... }
    uses A;
  }
}
grouping A {
  status{}
  leaf-list protocol { ..... }
  leaf-list X { ..... }
  uses httpGroup;
}

Мне нужно, чтобы это условие условия было включено в httpGroup, чтобы убедиться, что значение протокола не настроено на любом уровне иерархии.

Я сделал это, добавив дополнительные пути родственников для поиска этого узла:

// same level
not(../protocol)

// next level
not(../and/protocol)
not(../or/protocol)

// previous level
not(../../protocol)
not(../../protocol)

//recursively down previous level
not(../../and/protocol)
not(../../or/protocol)

// third level
not(../and/or/protocol)
not(../and/and/protocol)

Как видите, это совсем не чистое решение.

Есть ли способ сделать это для всей иерархии, например:

if protocol node exists and http-list exists then error.

Заранее спасибо.

1 Ответ

0 голосов
/ 25 января 2019

Группировки предназначены для многократного использования. Это плохая практика пытаться создать группировку, которая может использоваться только в определенных контекстах. Это именно то, что происходит, если вы определяете выражение XPath в группе, и это выражение ссылается на узлы, которые находятся «вне» этой группировки (например, еще не известный узел данных предка, или, что еще хуже, - предок с определенным именем).

Правильный способ для вас справиться с этой ситуацией - использовать оператор уточнения в каждом отдельном контексте, где используется эта группировка. Вы нацеливаете на лист value, а затем уточняете его, добавляя оператор must, выражение которого, конечно, зависит от контекста использования. Вы не определяете обязательный оператор в группе http-list.

Внутри группировки A:

grouping A {
  status{}
  leaf-list protocol { ..... }
  leaf-list X { ..... }
  uses httpGroup {refine "http-list/value" {must "not(../../protocol)";}}
}

Как видите, группировка A теперь полностью самодостаточна и может использоваться в любом контексте - с этим у проблем не должно быть проблем.

...