我可以指定XMLSchema中只有一个子元素具有某个唯一属性吗?

时间:2012-11-02 02:46:19

标签: xml xsd

是否可以在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"/>

1 个答案:

答案 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。