1

<option selected>是否可以在 XSD中指定 HTML 的等价物——确切地说只有一个元素具有特定属性?

例如,给定以下示例 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而不是 apattern是合理的:

1)这个模式是否明智地表示我的意图?(即有零或一和<foo bar="bar"/>零或多个<foo/><foo-list>

2)有没有办法要求只有一个<foo bar="bar"/>

4

1 回答 1

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。

于 2012-11-02T03:23:14.183 回答