0

是否可以使用 XSD 将节点名称限制为枚举,然后基于此枚举添加另一个限制?

例如,我有这个 xml:

<a>
    <b name="string" value="hello">
    <b name="integer" value="123">
</a>

我希望“b”节点具有来自枚举 {“string”、“integer”} 的名称属性。然后,如果它是“string”,我希望“value”属性是 xs:string 的类型,如果它是“integer”,我希望“value”属性是 xs:integer 的类型。

4

3 回答 3

1

你可以做一定的限制,例如你可以限制你的name属性的值来自给定的列表——但是你不能在“如果名称是字符串,那么值的类型必须是 xs:string”之间表达这种关系XML 架构。

您必须使用其他一些技术(如Schematron),或者在您的应用程序代码中检查这一点。

马克

于 2009-08-07T09:06:49.310 回答
1

不,您不能在 XSD 中执行此操作。本质上,您有 2 个不同类型的 <b>。这违反了元素一致性规则

你有几个选择,

  1. 在您的应用程序中执行架构之外的规则。这就是我要做的。
  2. 正如其他人所提到的,使用像 Schematron 这样的验证语言。
  3. 切换到更强大的模式语言,例如Relax NG
于 2009-08-07T11:00:30.017 回答
0

不,但是您将 name 视为一种类型 - 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

于 2009-08-07T10:46:15.600 回答