Ограничить использование глобального элемента снаружи / вместо корневого элемента - PullRequest
0 голосов
/ 27 января 2011

Я определил некоторые глобальные элементы в моей схеме xsd. Теперь, если XML-файл содержит какой-либо один из глобальных элементов (без каких-либо других корневых элементов), проверка не должна этого допустить. Но в моем случае, если присутствует только глобальный элемент, файл успешно проверен.

В моем случае есть элемент GROUP, который является глобальным элементом. Этот элемент всегда должен содержаться в элементе CASE, но если удалить элемент CASE, файл xml все равно будет успешно проверен.

Я не могу сделать элемент GROUP локальным, так как он имеет некоторую сложную логику (рекурсивные обращения к себе) и используется более чем в одном месте. Более того, когда я пытался сделать его локальным, он выдавал ошибки.

Теперь есть какое-либо решение ограничить его использование вне элемента CASE.

Пример (Разрешено):

<?xml version="1.0" encoding="utf-8" ?>
<CASE>
   <GROUP>
   </GROUP>
 </CASE>

Не разрешено:

<?xml version="1.0" encoding="utf-8" ?>
<GROUP>
</Group>  

Ответы [ 3 ]

1 голос
/ 28 января 2011

Вы можете попробовать обходной путь: оберните элемент <GROUP> внутри элемента <xs:group name="someName">, чтобы эта группа содержала только ваш элемент <GROUP>. (да, немного запутанно из-за этих имен ...) В этом случае всякий раз, когда вам нужно обратиться к глобальному элементу <GROUP>, вам следует вместо этого обратиться к этой группе "someName".

Этот обходной путь может быть неприменим для вас, если ваше определение рекурсивного элемента является сложным.

1 голос
/ 09 февраля 2011

Вы пытались сделать элемент Group локальным, но присвоили ему глобальный тип, чтобы разрешить рекурсию и повторное использование?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Case" type="CaseType"/>
  <xs:complexType name="CaseType">
    <xs:sequence>
      <xs:element name="Group" type="GroupType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="GroupType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Group" type="GroupType"/>
      <xs:element name="Case" type="CaseType"/>
    </xs:choice>
  </xs:complexType>
</xs:schema>
1 голос
/ 27 января 2011

Извините, но в схеме XML нет способа указать, какой глобальный элемент является единственным, разрешенным в качестве корневого. Возможно, вам придется взглянуть на другие методы для проверки этого требования (например, встраивание Schematron rules

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...