xsd: assert (сложная проверка символов) - PullRequest
0 голосов
/ 01 февраля 2019

Есть ли способ проверить, что шаблон содержит только те символы, которые передаются в @param?

Я рассмотрел варианты с функциями xpath (fn :), но не нашел подходящей опции.

это 2 действительных xml, например:

<rule type="myRule" template="A-B-CB">
  <attribute param="B"/>
  <attribute param="A"/>
  <attribute param="C"/>
</rule> 


<rule type="myRule" template="A(C)-B">
  <attribute param="C"/>
  <attribute param="A"/>
  <attribute param="B"/>
</rule> 

и 2 недопустимых xml:

<rule type="myRule" template="AB-CD">
  <attribute param="A"/>
  <attribute param="B"/>
  <attribute param="C"/>
</rule> 


<rule type="myRule" template="AC">
  <attribute param="A"/>
  <attribute param="B"/>
  <attribute param="C"/>
</rule>

возможно, есть идеи, как реализовать это с помощью schematrone или иным способом?

1 Ответ

0 голосов
/ 01 февраля 2019

Таким образом, набор букв в @template должен быть точно таким же, как набор букв в ./attribute/@param?

То есть distinct-values(string-to-codepoints(replace(@template, '\P{L}', ''))) должен совпадать с distinct-values(attribute/@param/string-to-codepoints()).

Так как же вы утверждаете, что две последовательности содержат одинаковые значения при перестановке?

В XPath 3.1, deep-equal(sort($X), sort($Y))

В XPath 2.0 я не могупридумайте что-нибудь лучше, чем

empty($X[not(.=$Y)]) and empty($Y[not(.=$X)])

Я оставлю вас, чтобы все это сложить.

...