扩展 XSD 架构以允许一个 XSD 标准元素类型中的新属性

Extend XSD schema to allow a new attribute in one XSD standard element type

我需要在 XSD 文件中添加不同类型的文档。我希望能够向文档元素添加一个名为“type”的属性,如下所示:

<xs:annotation>

   <xs:documentation type="doc">
       My documentation....
   </xs:documentation>

   <xs:documentation type="example">
       My first example...
   </xs:documentation>

   <xs:documentation type="example">
       My second example...
   </xs:documentation>

   <xs:documentation type="tip">
        My tip.
   </xs:documentation>

</xs:annotation>

我可以在 XSD 中更改所有需要的内容以实现此目的。我该怎么做?

模式的模式已经允许这样做,但仅适用于自定义命名空间中的属性,例如

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:my="http://example.com/my-annotation-types"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified"
    vc:minVersion="1.1">
    
    <xs:element name="foo" type="xs:string">
        <xs:annotation>
            <xs:documentation my:type="doc"></xs:documentation>
        </xs:annotation>
    </xs:element>
    
</xs:schema>

被允许作为架构的架构在大多数地方声明并使用和扩展 xs:annotated

<xs:complexType name="openAttrs">
    <xs:annotation>
      <xs:documentation>
       This type is extended by almost all schema types
       to allow attributes from other namespaces to be
       added to user schemas.
     </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="annotated">
    <xs:annotation>
      <xs:documentation>
       This type is extended by all types which allow annotation
       other than &lt;schema> itself
     </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="xs:openAttrs">
        <xs:sequence>
          <xs:element ref="xs:annotation" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

除了 type 属性上使用命名空间之外,还有其他一些可能性:

  1. 使用子 type 元素:

    <xs:documentation>
      <type>tip</type>
      My tip.
    </xs:documentation>
    
  2. 使用按类型命名的包装元素,通常比使用 type 属性更可取:

    <xs:documentation>
      <tip>
        My tip.
      <tip>
    </xs:documentation>
    

当然,这些添加的元素本身可以位于您自己设计的命名空间中。