使用字符串simpleType
和restriction
命名为*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;-]){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;-]){1,8}"/>
</xs:restriction>
</xs:simpleType>
答案 0 :(得分:0)
请注意,xs:ID
和xs: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;-]){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>