我对使用 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
orpost post post
)和没有空格(例如getpost
orpostputdelete
)
编辑:
在玩了一会儿之后,我想出了一个主意:枚举所有可能的序列。谢天谢地,这个列表(暂时)固定在四种常用的运输方式上,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>
任何人都可以看到这不是一个好主意的原因吗?