是否可以使用XSD将节点名称重新枚举为枚举,然后根据此枚举添加另一个限制?
在示例中,我有这个xml:
<a>
<b name="string" value="hello">
<b name="integer" value="123">
</a>
我希望“b”节点具有枚举{“string”,“integer”}的name属性 . 然后,如果它是“字符串”,我希望“value”属性是xs:string的类型,如果它是“整数”,我希望“value”属性是xs:integer的类型 .
3 回答
不可以 . 您不能在XSD中执行此操作 . 从本质上讲,你有2个不同类型的b . 这违反了Element Consistency rule .
你有几个选择,
在应用程序中强制执行架构之外的规则 . 这就是我要做的 .
使用Schematron等验证语言,如其他人所述 .
切换到更强大的模式语言,如Relax NG .
你可以做一定的限制,例如您可以限制
name
属性的值来自给定列表 - 但您无法在XML架构中的"if name is string, then the type of value must be xs:string"之间表达这种关系 .您必须使用其他技术(如Schematron),或在您的应用代码中进行检查 .
渣
不 . 但是您将名称视为类型 - 而XML Schema确实支持由字符串值确定的元素的
complexType
. 但是,您必须在XML文档中使用属性名称"xsi:type",因此它看起来像这样:那个's the best that XML Schema can do I'恐怕 . 官方入门书中的更多细节(不幸的是,这可能非常令人困惑):http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs