XSD限制

时间:2009-08-07 09:00:11

标签: xml xsd restriction

是否可以使用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 个答案:

答案 0 :(得分:1)

你可以做某些限制,例如您可以限制name属性的值来自给定列表 - 但是您无法在XML模式中表达“如果name是字符串,那么值的类型必须是xs:string”之间的这种关系

您必须使用其他技术(例如Schematron),或在您的应用代码中进行检查。

马克

答案 1 :(得分:1)

没有。您无法在XSD中执行此操作。从本质上讲,你有两个不同类型的b&lt; b&gt;。这违反了Element Consistency rule

您有几个选择,

  1. 在应用程序中强制执行架构之外的规则。这就是我要做的。
  2. 使用Schematron等验证语言,如其他人所述。
  3. 切换到更强大的架构语言,如Relax NG

答案 2 :(得分:0)

没有。但是您将名称视为类型 - 而XML Schema 对由字符串值确定的元素的complexType有一些支持。但是,您必须在XML文档中使用属性名称“xsi:type”,因此它看起来像这样:

<a>
    <b xsi:type="string" value="hello">
    <b xsi:type="integer" value="123">
</a>

这是XML Schema可以做的最好的事情。官方入门中的更多细节(遗憾的是,它可能非常令人困惑): http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs