Я достаточно новичок в работе со схемами XML, поэтому извините за мою некомпетентность, если это более тривиально, чем я сам полагаю.
Я пытаюсь создать обязательный атрибут, который должен содержать одно или несколько строковых значений, разделенных пробелами, из списка. Список представляет собой 4 типичных метода HTTP-запроса; получить
, опубликовать
, поместить
и удалить
.
Итак, допустимые элементы будут включать:
<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
)
Edit :
Немного поигравшись с этим, я пришел к идее: перечислить все возможные последовательности. К счастью, этот список ( на данный момент ) привязан к четырем обычным транспортным методам: get
, post
, put
и удалить
, поэтому я подумал:
<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>
Может ли кто-нибудь увидеть причину, по которой это не будет хорошей идеей?