2015-08-14 3 views
3

Я пытаюсь создать 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: Несмотря на то, что я просто ответил сам, я оставлю открытым вопрос на сегодня, если кто-то может придумать что-то более элегантное, чем ... то, что я создал. (Я не уверен, что удаление вопрос - если вы думаете, что это не помогает, пожалуйста, пометьте его или что-то подобное спасибо.).

ответ

4

Self-ответ:

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

Мне не пришло в голову, что на самом деле можно использовать несколько min/maxInclusives, потому что я думал по именам и что они будут в значительной степени уникальны. Ну, это не так, поэтому я пришел с этой прекрасной мерзостью:

<xs:simpleType name="RANGETEST_Data"> 
    <xs:union> 
    <xs:simpleType> 
     <xs:restriction base="xs:integer"> 
      <xs:minInclusive value="9"/> 
      <xs:maxInclusive value="12"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType> 
     <xs:restriction base="xs:integer"> 
      <xs:minInclusive value="15"/> 
      <xs:maxInclusive value="20"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType> 
     <xs:restriction base="xs:integer"> 
      <xs:enumeration value="1"/> 
     </xs:restriction> 
    </xs:simpleType> 
    </xs:union> 
</xs:simpleType> 

Который является именно типом универсального подхода, который я хотел.

+3

Действительно, это подход, который я собирался предложить. Есть люди, которые любят использовать регулярные выражения для всего, но я не один из них. Однако в XSD 1.1 я бы использовал утверждение: 'assert test =" $ value = (1, 9 to 12, 15 to 20) "' –

+0

Я чувствую честь вашего комментария. Интересная возможность, которую я не рассматривал, но то, что мы пытаемся сделать, состоит в том, чтобы вносить типы структурных вещей (minInclusive, length, all that) в типы, чтобы как можно короче сохранить часть утверждения (по нескольким причинам) , Но спасибо за то, что вы научили меня чему-то для потенциальных будущих приложений. – LindenRathan

Смежные вопросы