2012-02-07 127 views
3

我想定义一个模式,其中包含指定XML模式类型的元素。此问题可能与XML Schema for schemas和此question有关。XML模式:定义类型的类型

这是我到目前为止有:

<xs:complexType name="metatype"> 
    <xs:sequence> 
     <xs:element name="datatype" type="datatype" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="location" type="locationtype" minOccurs="0"maxOccurs="unbounded"/> 
     <xs:element name="alias" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:ID" use="required"/> 
    <xs:attribute name="editable" type="xs:boolean" default="false" use="optional"/> 
    <xs:attribute name="forcedvisible" type="xs:boolean" default="false" use="optional"/> 
</xs:complexType> 

其中的数据类型是:

<xs:complexType name="datatype"> 
    <xs:sequence> 
     <xs:element name="restriction"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="enumeration"> 
       <xs:complexType> 
       <xs:attribute name="value" type="xs:string" use="required"/> 
       </xs:complexType> 
      </xs:element> 
      </xs:sequence> 
      <xs:attribute name="base" type="xs:string" use="required"/> 
      <!-- type xs:string is not accurate for XML Schema type --> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

,而不用声明的数据类型的,我想用在Schema for schemaslocalSimpleType或至少simpleRestrictionType但我的XML Schema编辑器(Visual Studio)似乎没有认识到这些类型。是否还需要引用另一个XML Schema文档?我真的很想避免定义整个XML Schema simpleType元素及其子标签的限制等。

回答

1

我想你应该能够编写一个模式,导入其中定义的S4S和引用类型。但是,有些工具完全可能会反对。

你不应该做的一件事是尝试处理一个修改的S4S,或者将额外的组件添加到XSD名称空间中。架构感知工具有权将S4S中的所有内容视为公理化,并向他们提供不同于其对这些组件内置知识的定义可能导致严重破坏。

1

您是否想使用xsd或创建自己的并编写自己的解析器?

您可以定义带有或没有限制的类型,也可以在通常包含xs的已知名称空间中将已定义的类型添加局部限制。

本地限制是最好的一个权衡,如果你使用它不止一次,定义DRY一个新的类型(DONOT重复自己)

例如

<xs:simpleType name="mySimpleTypeA"> 
    <xs:restriction base = "xs:string"> 
    <xs:enumeration value ="on"/> 
    <xs:enumeration value = "off"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:complexType name="myComplexTypeA> 
    <xs:sequence> 
    <xs:element name="someElementName"> 
     <xs:simpleType> 
     <xs:restriction base ="xs:string"> 
      <xs:minLength ="8"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    </xs:sequence> 
    <xs:attribute name="someAttributeName" use="required" type="mySimpleTypeA"/> 
</xs:complexType> 

然后你可以用它们作为

<xs:element name = "Fred" type ="myComplexTypeA"/> 

调用你的元素的限制,是不会让一个...

哦我的头顶这个,没有验证它,但它应该接近。