В проверке схемы XSD 1.0 любой доступный параметр для проверки элемента имеет какие-либо атрибуты?

В файле XSD для элемента несколько атрибутов указаны как необязательные. Необходимо проверить, доступен ли какой-либо из перечисленных атрибутов во входном XML-файле.


person Rishma S    schedule 06.01.2015    source источник
comment
Что хотел бы сделать? Если я правильно понимаю, вы хотели бы определить схему, говорящую что-то вроде: для этого элемента foo-e я хотел бы установить один из следующих атрибутов foo-att-1 или foo-att-a2 или foo-att-a3?   -  person potame    schedule 06.01.2015
comment
Да ты прав. Мы можем сделать это в схеме xml 1.1, используя оператор xs:assert. Но требование в 1.0.   -  person Rishma S    schedule 06.01.2015
comment
Ну, в этом случае, боюсь, это невозможно с чистой схемой. Могу ли я предложить вам добавить правила Schematron, кроме...   -  person potame    schedule 06.01.2015
comment
Поскольку ограничения утверждений Schematron и XSD 1.1 настолько общие, можно с уверенностью сказать, что они вам подойдут. Однако, если вы предоставите конкретные примеры XML, который вы хотите сделать допустимым, и XML, который вы хотите сделать недействительным, мы можем найти приемлемое решение XSD 1.0 для вашей конкретной проблемы. Однако вам придется указать это более точно, чтобы был хоть какой-то шанс.   -  person kjhughes    schedule 06.01.2015


Ответы (1)


В XSD 1.0 вы можете использовать xs:key, чтобы гарантировать наличие у элемента хотя бы одного атрибута. Пример:

<xs:element name="elem">
    <xs:complexType>
        <xs:attribute name="a" type="xs:int" use="optional" />
        <xs:attribute name="b" type="xs:int" use="optional" />
        <xs:attribute name="c" type="xs:int" use="optional" />
        <xs:attribute name="d" type="xs:int" use="optional" />
    </xs:complexType>
    <xs:key name="attributePresent">
        <xs:selector xpath="." />
        <xs:field xpath="@*" />
    </xs:key>
</xs:element>

Например, если вы хотите гарантировать, что хотя бы один из атрибутов b или c присутствует в элементе, вы можете использовать

<xs:field xpath="@b | @c" />
person sergioFC    schedule 06.01.2015
comment
Работает только в том случае, если указан только один атрибут — если указано более одного атрибута, проверка завершится неудачно. Пример XML: <elem a="1" b="2" c="3" /> xmlint дает: element elem: Schemas validity error : Element '{mynamespace}elem', attribute 'b': The XPath '@*' of a field of key identity-constraint '{mynamespace}attributePresent' evaluates to a node-set with more than one member. Тот же результат при использовании <xs:field xpath="@b | @c" />. - person codesniffer; 27.03.2020