Xsd XML模式类型
如果我有一个元素,动物:Xsd XML模式类型,xsd,Xsd,如果我有一个元素,动物: <animal name="dog"/> 它可以将以下内容作为名称属性的值: 狗 猫 鸟 $(任意字符串) 其中$(ANY_STRING)是一个简单的名称、值替换,某些软件将在以后执行并验证(ANY_STRING就是字面上的ANY STRING)。这个元素的XML模式是什么样子的?限制三个已知名称非常简单: <xs:simpleType name="AnimalNames"> <xs:restriction base=
<animal name="dog"/>
它可以将以下内容作为名称属性的值:
- 狗
- 猫
- 鸟
- $(任意字符串)
<xs:simpleType name="AnimalNames">
<xs:restriction base="xs:string">
<xs:enumeration value="dog"/>
<xs:enumeration value="cat"/>
<xs:enumeration value="bird"/>
</xs:restriction>
</xs:simpleType>
限制$(任何_字符串)本身也很容易(使用xs:pattern来限制)。但由于属性可能只是简单类型,是否可以指定该属性可能位于枚举列表或$(任意字符串)值中
我考虑的另一个选择是限制以下模式:
<xs:pattern value="dog|cat|bird|$(.*)"/>
尽管随着可能值列表的增加,这会变得非常糟糕
当然,最简单的方法是只声明一个字符串类型,但我希望比这更严格。一种定义半封闭列表的方法,使用一组为文档明确指定的已知值,然后使用转义图案填充来允许其他字符串,是使用
AnimalNames
类型和xs:NMTOKEN或xs:Name(或任何内置或用户定义的类型最能捕获您对未枚举的其他名称的约束)的联合来定义属性
正如guidot在他的评论中指出的那样,这样的联合接受与其最具包容性的成员类型相同的一组值,因此对于其唯一目的是把关的模式来说,它毫无意义。该技术对于文档和类型驱动的分派非常有用(如果验证成员类型是AnimalNames
do X else do Y)
为了适应不提供关于哪个成员类型验证了联合类型的特定值的信息的模式验证器,一些词汇表设计者按照guidot的建议进行操作,并提供两种元素类型,一种用于已知/预测/预期的动物名称,另一种用于其他名称。或者,它们将类型AnimalNames
指定为接受字符串dog
、cat
、bird
和other
,将属性name
定义为具有类型AnimalNames
,并定义另一个属性(称之为other name
)定义为当且仅当name=“other”
时才有意义。所以狗是用
<animal name="dog"/>
和仓鼠
<animal name="other" other-name="hamster"/>
这使得在仍然接受其他名称的情况下,特别处理已知名称变得相当简单。对不起,如果第四个选项是任何字符串,那么我真的不明白,通过显式声明三个值可以获得什么,这三个值都清楚地包含在其中。我肯定会介绍另一个分支,因此您可以使用预定义的animal或包含具有任意值的animal的其他(元素/属性)。