Я довольно новичок в работе со схемами XML, поэтому извините мою некомпетентность, если это более тривиально, чем я сам считаю, что это должно быть.
Я пытаюсь создать обязательный атрибут, который должен содержать 1 или более строковых значений, разделенных пробелами, из списка. Список представляет собой 4 типичных метода HTTP-запроса; get
, post
, put
и delete
.
Итак, допустимые элементы будут включать:
<rule methods="get" />
<rule methods="get post" />
<rule methods="post put delete" />
Принимая во внимание, что недопустимые элементы будут включать:
<rule methods="get get" />
<rule methods="foobar post" />
<rule methods="get;post;put" />
Я пытался дурачиться с перечислениями и длиной, но я не верю, что я понимаю, что мне нужно делать ( или в этом отношении, если это действительно возможно, хотя кажется, что это должно быть )
Вот где я сейчас, благодаря @tdrury:
<xs:attribute name="methods" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse" />
<xs:pattern value="(?:(?:get|post|put|delete)\s?){1,4}" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
Что работает, за исключением повторения (, например get get
или post post post
) и отсутствующих пробелов (, например getpost
или postputdelete
)
Редактировать
Немного поиграв с этим, у меня возникла идея: перечисление всех возможных последовательностей. К счастью, этот список ( на данный момент ) привязан к четырем обычным транспортным методам, get
, post
, put
и delete
, поэтому я решил:
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse" />
<xs:enumeration value="delete" />
<xs:enumeration value="put" />
<xs:enumeration value="put delete" />
<xs:enumeration value="post" />
<xs:enumeration value="post delete" />
<xs:enumeration value="post put" />
<xs:enumeration value="post put delete" />
<xs:enumeration value="get" />
<xs:enumeration value="get delete" />
<xs:enumeration value="get put" />
<xs:enumeration value="get put delete" />
<xs:enumeration value="get post" />
<xs:enumeration value="get post delete" />
<xs:enumeration value="get post put" />
<xs:enumeration value="get post put delete" />
</xs:restriction>
Может кто-нибудь увидеть причину, по которой это не будет хорошей идеей?