我可以指定只有一个子元素具有的XMLSchema一定的独特属性?
问题描述:
是否可以指定HTML的<option selected>
的XSD等效 - 正是和只有一个元素都有一个特定的属性?我可以指定只有一个子元素具有的XMLSchema一定的独特属性?
例如,假设下面的示例XML片段:
<foo-list>
<foo/>
<foo bar="bar"/>
<foo/>
</foo-list>
我可以写出如下XSD,以确保只有一个foo
有@bar
:
<xs:element name="foo-list">
<!-- FOO-LIST contains [1..n] FOO elements -->
<xs:complexType>
<xs:sequence>
<xs:element ref="foo" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- any FOO with @BAR must have unique @BAR -->
<xs:unique name="oneFooBar">
<xs:selector xpath="foo"/>
<xs:field xpath="@bar"/>
</xs:unique>
</xs:element>
<xs:element name="foo">
<xs:complexType>
<!-- FOO has optional @BAR -->
<xs:attribute name="bar">
<xs:simpleType>
<!-- @BAR must = "bar", if specified -->
<xs:restriction base="xs:string">
<xs:enumeration value="bar"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
假设一切的适当资格,而且我使用的纸牌enumeration
代替pattern
的决定是合理的:
1)这个模式是否合理地表示我的意图? (即,有在<foo-list>
零个或一个<foo bar="bar"/>
和零个或多个<foo/>
)
2)是存在于要求有恰好一个<foo bar="bar"/>
的方法吗?
答
1)是的,确实如此,在一个“怪异”的解决方法十岁上下的方式。
2)不与股票XSD 1.0。扔在Schematron中,你就全都准备好了。或者使用断言转移到XSD 1.1(这可以让您确切地了解Schematron为您所需做的事情)。事情是,既然你没有指定目标平台,XSD 1.1的实现很难实现(Java在Xerces中有一个免费的选项,并且在Saxon EE中支付),但是其他的如.NET没有任何空闲。 Schematron“编译器”实际上仅仅是将模式转换为XSLT的转换;它可以是1.0或2.0,这意味着它可以被用于在几乎任何(合理)平台增强正常XSD 1.0。
是否有可能为你的“怪异”的解决方法 - ishness详细点吗?如果有这样的标准模式,我会很乐意让它更简单,更“正常”。 –
@MattyK,遗憾的是没有“直接”或者优雅的方式来准确地说出你想要的1)。这就是为什么“解决方法”的原因。我的意思是“怪异”作为赞美:通过将值域限定为唯一值来强制执行“至多一个”是一种有趣的方式,因此使用唯一而不是关键约束。例如,在属性接受true/false的情况下,它不起作用。 –