我是使用
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>
哪个有效,除了重复(如获取或发布帖子后)和缺少空格(如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>
任何人都可以看到这不是一个好主意的原因吗?
解决方法
基本问题也可以用枚举来解决:
<xs:attribute name="methods" use="required"> <xs:simpleType> <xs:restriction> <xs:simpleType> <xs:list> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="get"/> <xs:enumeration value="post"/> <xs:enumeration value="put"/> <xs:enumeration value="delete"/> </xs:restriction> </xs:simpleType> </xs:list> </xs:simpleType> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> </xs:attribute>
遗憾的是,这与< xs:pattern>具有相同的限制.解决方案并且无法验证列表中的每个标记是否唯一.然而,它确实解决了空白问题(getpost将被拒绝).