是否可以在XSD中指定等效的HTML <option selected>
- 完全而只一个元素具有特定属性?
例如,给出以下示例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 bar="bar"/>
中有零个或一个<foo/>
和零个或多个<foo-list>
2)有没有办法要求完全一个<foo bar="bar"/>
?
答案 0 :(得分:0)
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。