使用逗号的XSD架构分隔的枚举列表
我试图为现有的XML文档创建一个XSD。我真的不能改变XML,所以我需要让XSD适合它(我知道这有点倒退)。使用逗号的XSD架构分隔的枚举列表
在XML中,有一个称为组的元素。这个元素有一个或多个特征。大约有40个有效的功能名称。所以我选择将它们建模为Enum。枚举看起来是这样的:
<xs:simpleType name="FeatureNamesEnumType">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="Feature1"/>
<xs:enumeration value="Feature2"/>
<xs:enumeration value="Feature3"/>
</xs:restriction>
</xs:simpleType>
然后,该组我有以下几点:
<xs:complexType name="groupType">
<xs:attribute type="FeatureNamesEnumType" name="features" use="required"/>
</xs:complexType>
我一直运行到的是,在XML文件中,属性可以设置为一个问题用逗号分隔的功能列表。例如:
<group name="Group1"
features="Feature1,Feature2"
</group>
这不会针对XSD进行验证,因为此逗号分隔列表在枚举中为no。
我知道最好让一个组包含一系列功能,但这不是一个选项,因为我无法更改XML文件。
我的目标是如果功能与枚举值不匹配,则导致验证失败。因此,例如,我想要以下内容无效:
<group name="Group1"
features="Feature1,Featur2"
</group>
拼写错误应导致此操作无效。在我的XSD中有没有一种方法可以指示Group上的features属性接受由仅有效枚举值组成的逗号分隔列表?
就其本身而言,XSD 1.0不能用于定义您需要的约束。如果您可以预处理或后处理这些字段以用逗号替换逗号,则可以定义FeatureNamesEnumType
的xsd:列表。
正确的方法取决于您的平台。例如,如果在.NET上,我会将这些字段定义为字符串,可能会被xsd:pattern约束;那么我会手动验证每个字段的值是否与上面定义的xsd:list类型的简单类型一致 - 这是在.NET中执行的一个非常简单的事情。如何有效地到达这些字段取决于您的处理模型...
使用正则表达式与xs:pattern
可以完全验证XSD中features
属性的值。取决于您的需求,如<xs:simpleType><xs:restriction base="xs:token"><xs:pattern value="(Feature1|Feature2|Feature3)(,(Feature1|Feature2|Feature3))*"/></xs:restriction></xs:simpleType>
。
xs:list几乎是我所需要的。我能够说服XML文件作者更改为分隔空间而不是逗号分隔。然后,xs:list工作得很好。 – Jon 2013-02-14 14:53:02