Я пытаюсь создать XSD, который должен проверять целочисленное значение элемента XML. То, что я хочу достичь, - это ограничить это значение для обоих диапазонов (так что min/maxInclusive не будет делать) и некоторых конкретных значений.Ограничение определенных чисел в XSD
Приведем пример. Я хочу, чтобы элемент был действительным, если он содержит 1, число между 9 и 12, или числом между 15 и 20. Я попытался придумать узор
<xs:pattern value="[(1)(9-12)(15-20)]"/>
, но это не работает , потому что (как я понимаю) часть 9-12 делает что-то вроде 9 | 0 | 1 ...., потому что она интерпретирует 12 не как целое. С однозначными цифрами, такими как
<xs:pattern value="[(1)(3-5)(7-9)]"/>
это действительно работает. Я попытался заключить многозначные числа в более круглые скобки, такие как 9- (12), но безрезультатно.
Я мог бы попытаться использовать для перечислений это так, как это:
<xs:restriction base="xs:integer">
<xs:enumeration value="1"/>
<xs:enumeration value="9"/>
<xs:enumeration value="10"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
....
</xs:restriction>
, но это невероятно непрактично, особенно для больших диапазонов. То же самое относится и к одной и той же вещи в виде шаблона:
<xs:pattern value="1|9|10|11|12|15....."/>
Так я вижу два пути прямо сейчас: либо есть образец, что я не в состоянии придумать сам, что позволяет мне использовать несколько одиночных номера и диапазоны, включая многозначные числа, или есть способ хоть как-то сделать что-то вроде
<xs:enumeration value="9"-"12"/>
это, кажется, довольно трудно создать такое регулярное выражение в общем, насколько я могу сказать, из каких моих коллег больше опыта с регулярными выражениями. Исходя из локализованных решений для моего точного примера здесь не слишком сложно, но я ищу универсальное решение, с помощью которого легко получить произвольный список (1,3-5,9-12,99) -999) и исключить из него ограничение XSD без лишних хлопот.
Из того, что я вижу, подход перечисления с разделением диапазонов на все содержащиеся в нем номера, по-видимому, является наиболее вероятным подходом к возможному действию, но он все равно будет невероятно уродливым.
Речь идет о XSD 1.1. Может быть, есть совершенно другой подход, на который я еще не наткнулся?
EDIT: Несмотря на то, что я просто ответил сам, я оставлю открытым вопрос на сегодня, если кто-то может придумать что-то более элегантное, чем ... то, что я создал. (Я не уверен, что удаление вопрос - если вы думаете, что это не помогает, пожалуйста, пометьте его или что-то подобное спасибо.).
Действительно, это подход, который я собирался предложить. Есть люди, которые любят использовать регулярные выражения для всего, но я не один из них. Однако в XSD 1.1 я бы использовал утверждение: 'assert test =" $ value = (1, 9 to 12, 15 to 20) "' –
Я чувствую честь вашего комментария. Интересная возможность, которую я не рассматривал, но то, что мы пытаемся сделать, состоит в том, чтобы вносить типы структурных вещей (minInclusive, length, all that) в типы, чтобы как можно короче сохранить часть утверждения (по нескольким причинам) , Но спасибо за то, что вы научили меня чему-то для потенциальных будущих приложений. – LindenRathan