В документе должен присутствовать атрибут утверждения XSD 1.1.

Используя XSD 1.1, можно ли утверждать, что атрибут существует где-то еще.

Пример:

<root>
  <someelement>
    <lookup name="test"/>
    <bla>
      <lookup name="tbl2"/>
      <morebla>
        <evenmore>
          <lookup name="tbl2"/>
        </evenmore>
      </morebla>
    </bla>
  </someelement>
  <table name="test">
    ...
  </table>
  <table name="tbl2">
    ...
  </table>
</root>

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

Утверждение должно быть в корневом элементе, поскольку невозможно утвердить дерево элементов, но как я могу утверждать для каждого элемента поиска независимо от того, где он находится в структуре документа?


person Christian Kruetzfeldt    schedule 03.06.2015    source источник
comment
//x выбирает все узлы с именем x, как показано в эта страница простого руководства.   -  person sergioFC    schedule 04.06.2015
comment
Да, оператор // был тем, что я пробовал сам. Моя идея заключалась в том, чтобы каждый $i в 1 считался (//поиск) удовлетворяет существует (//таблица/@name = lookup[$i]/@name) Однако это не работает, поэтому я не уверен, что / Часть /lookup неверна или удовлетворяет мою часть.   -  person Christian Kruetzfeldt    schedule 04.06.2015
comment
Мне жаль. Я прочитал ваш вопрос и подумал, что вы не знаете этого основного оператора. Ваш подход в порядке, взгляните на мой ответ, который также использует синтаксис every $v1 in $v2 satisfies.   -  person sergioFC    schedule 04.06.2015


Ответы (1)


Имейте в виду, что в XPath 2.0 сравнение $s1 = $sequence2 возвращает true тогда и только тогда, когда $s1 (или любой из его элементов, если это последовательность) существует в $sequence2. Таким образом, вы можете использовать этот простой тест XPath для вашего утверждения:

every $lookupName in descendant-or-self::lookup/@name satisfies $lookupName = descendant-or-self::table/@name
person sergioFC    schedule 03.06.2015
comment
Хм, я попробовал это, и выполнение этого как запроса XPath 2.0 работает, но как утверждение в файле xsd - нет. Я пытаюсь это сделать с помощью Oxygen XML Editor 17.0, и он выдает следующую ошибку. Идентификатор системы: /home/christian/BF-XML/test.xml Основной файл проверки: /home/christian/BF-XML/test.xml Схема : /home/christian/BF-XML/test.xsd Имя механизма: Saxon-EE 9.6.0.5 Серьезность: ошибка Описание: Корень элемента не удовлетворяет утверждению каждый !$lookupName в //Lookup/@table удовлетворяет $lookupName = // Таблица/@name Начальное местоположение: 21:0 - person Christian Kruetzfeldt; 04.06.2015
comment
Я попробовал другой валидатор и получил лучшее описание ошибки: Имя движка: Xerces Серьезность: предупреждение Описание: cvc-xpath.3.13.4.2b: выражение XPath утверждения, такое как ('каждое $lookupName в //Lookup/@table удовлетворяет $ lookupName = //Table/@name'), содержащий / или //, для типа схемы '#AnonType_root', не может дать допустимый результат (поскольку дерево утверждений имеет корневой элемент без родительского элемента). Место начала: 9:23 Место окончания: 9:99 URL-адрес: w3.org /TR/xmlschema11-1/#cvc-xpath - person Christian Kruetzfeldt; 04.06.2015
comment
@ChristianKruetzfeldt Вы правы (я также использовал запрос в Oxygen). Чтобы заставить его работать в утверждении XSD 1.1, вы можете использовать axe descendant-or-self. Я обновил ответ. - person sergioFC; 04.06.2015
comment
Возможно, вам будет интересно узнать, что Saxon имеет оптимизацию для утверждений вида каждый $x в ABC удовлетворяет DEF — если есть элемент $x, который не удовлетворяет условию DEF, он сообщит вам о расположении этого конкретного элемента. - person Michael Kay; 04.06.2015
comment
@sergioFC Спасибо, ваш обновленный ответ работает отлично, и что еще более важно, я также понимаю, почему - узнал кое-что новое о XSD. - person Christian Kruetzfeldt; 04.06.2015