Поскольку RelaxNG было упомянуто в ответе Альнитака, вот решение
с RelaxNG (язык, который в большинстве случаев лучше, чем W3C
Схема). Запишите ИЛИ (|) в определении elem:
start = document
document = element document {elem+}
elem = element elem {ref | value}
ref = attribute ref {text}
value = attribute value {xsd:integer}
Если у меня есть этот XML-файл:
<document>
<elem value="1" />
<elem ref="something else" />
</document>
Принят рН и xmlint :
% rnv attributes-exclusive.rnc attributes-exclusive.xml
attributes-exclusive.xml
% xmllint --noout --relaxng attributes-exclusive.rng attributes-exclusive.xml
attributes-exclusive.xml validates
Если я добавлю в файл XML:
<elem value="1" ref="something else" />
Я получаю ошибки проверки, как я хочу (обратите внимание, что сообщения об ошибках
являются субоптимальными):
% rnv attributes-exclusive.rnc attributes-exclusive.xml
attributes-exclusive.xml
attributes-exclusive.xml:4:0: error: attribute ^ref not allowed
required:
after
% xmllint --noout --relaxng attributes-exclusive.rng attributes-exclusive.xml
attributes-exclusive.xml:4: element elem: Relax-NG validity error : Invalid attribute value for element elem
attributes-exclusive.xml fails to validate