2009-08-07 92 views
0

是否有可能使用XSD将节点名称重新枚举为枚举,然后基于此枚举添加其他限制?XSD限制

在例子中,我有这样的XML:

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

我想 “B” 的节点具有枚举名称的属性{ “串”, “整数”}。 然后,如果它是“字符串”,我希望那个“值”属性是类型的xs:字符串, ,如果它是“整数”,我希望这个“值”属性是类型的xs:整数。

回答

1

不,你不能在XSD中做到这一点。本质上,你有不同类型的b> 2 < b> s。这违反了Element Consistency rule

您有几种选择,

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

就像我一样。感谢您的回答。 – ppiotrowicz 2009-08-07 11:13:58

1

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

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

马克

+0

感谢您的回复。我会更接近schematron。 – ppiotrowicz 2009-08-07 09:24:08

0

不可以,但你喜欢一个类型的治疗名字 - 和XML Schema 确实有一个元素的complexType由一个字符串值,来确定一定的支持。但是,你必须使用属性名称:你的XML文档中的“XSI型”,所以它看起来像这样:

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

这是XML模式可以做的恐怕是最好的。更多的细节在官方的引物(这可能是很令人困惑,不幸): http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs