将ID添加到派生类型

时间:2017-01-18 20:32:50

标签: xsd msxml msxml6 xsd-1.0

使用字符串simpleTyperestriction命名为*pattern*。此sT basicType 将应用于多个elements。问题是这些elements中的两个需要将类型更改为base =“xs:ID”。

这可以通过创建唯一的sT来完成:一个sT用于使用基本*pattern* restriction的字段,另一个sT用于需要ID base的两个字段。问题是模式必须在两个sT声明中重复。这是我的应用程序中的一个尼特,但我想知道是否有其他方法可用。具体而言,出于所有常见原因,允许继承模式并因此不重复。 BTW:任何替代的XSD 1.0方法都可以。我不打算仅将此限制为simpleType解决方案。

我想要做的是有一个模式 sT,它可以应用于非ID字段,并有另一个派生的sT,它为继承了ID的字段添加ID基础另一个sT的模式。因此, pattern 仅在一个地方定义和维护。

FWIW,这是一个MSXML6 Excel应用程序。

以下代码段显示每个sT中的模式都是重复的。

问)如何简化这一过程?

<xs:simpleType name="basicType">
    <xs:restriction base="xs:string">
        <xs:pattern value="[A-Z]([A-Z0-9;&#45;]){1,8}">
            <!-- Upper case A~Z followed by 1~8, upper-case alphanumerics including hyphen. No whitespace. -->
        </xs:pattern>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="IDType">
    <xs:restriction base="xs:ID">
        <xs:pattern value="[A-Z]([A-Z0-9;&#45;]){1,8}"/>
    </xs:restriction>
</xs:simpleType>

1 个答案:

答案 0 :(得分:0)

请注意,xs:IDxs:IDREF是源自DTD的遗留类型。

您的问题是XML Schema identity constraints的一个好例子。它们与类型层次结构分离,允许您独立地描述节点之间的引用关系。

在模式中,使用xs:key元素声明标识约束, 标记关键节点(= ID)和xs:keyref元素, 它标记引用键的节点(= IDREF)。

以这个简单的文件为例:

<root>
  <basic>BASIC</basic>
  <foo id="HELLO"/>
  <bar ref="HELLO"/> <!-- Must reference a <foo> -->
</root>

可以使用以下架构进行描述。注意 basicType仅声明一次,可用于所有节点, 它们是简单元素还是关键属性:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="basicType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Z]([A-Z0-9;&#45;]){1,8}"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="basic" type="basicType"/>
        <xs:element name="foo">
          <xs:complexType>
            <xs:attribute name="id" type="basicType"/>
          </xs:complexType>
        </xs:element>
        <xs:element name="bar">
          <xs:complexType>
            <xs:attribute name="ref" type="basicType"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>

    <!-- Identity constraints in the scope of <root> -->

    <xs:key name="basicKey">
      <xs:selector xpath="foo"/> <!-- Apply to <foo> children -->
      <xs:field xpath="@id"/>    <!-- Value of "id" attribute -->
    </xs:key>

    <xs:keyref name="basicKeyref" refer="basicKey">
      <xs:selector xpath="bar"/> <!-- Apply to <bar> children -->
      <xs:field xpath="@ref"/>   <!-- Match "ref" attribute with "id" from basicKey -->
    </xs:keyref>

  </xs:element>
</xs:schema>