xsd相当于dtd

时间:2013-09-05 09:54:57

标签: xsd dtd

在模式SCOTT中的db中我有两个表POLKI和PUDELKA这样创建:

create table POLKI (
ID_POLKI NUMBER(3) CONSTRAINT PO_PK PRIMARY KEY,
NAZWA VARCHAR2(10) NOT NULL);
create table PUDELKA (
NAZWA VARCHAR2(10) NOT NULL,
KOLOR VARCHAR2(10),
ID_POLKI NUMBER(3) CONSTRAINT PU_PO_FK
REFERENCES POLKI(ID_POLKI) ); 

通过映射SQL / XML获得的dtd看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT DB (SCOTT)>
<!ELEMENT SCOTT (POLKI, PUDELKA)>
<!ELEMENT POLKI (ROW1*)>
<!ELEMENT PUDELKA (ROW2*)>
<!ELEMENT ROW1 (ID_POLKI, NAZWA)>
<!ELEMENT ROW2 (NAZWA, KOLOR?,ID_POLKI?)> 
<!ELEMENT NAZWA (#PCDATA)>
<!ELEMENT KOLOR (#PCDATA)>
<!ELEMENT ID_POLKI (#PCDATA)>

我必须通过填充已部分制作的xsd中的空白来创建相当于dtd的xsd文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="poprawka"
elementFormDefault="qualified" attribute
FormDefault="unqualified"
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . >
<xs:simpleType name="varchar2_10">
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
<xs:element name="DB">
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
<xs:element name="SCOTT". . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
<xs:element name="POLKI". . . . . . .
. . . . . . . . . . . . . . . . . . . .>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
<xs:element name="ROW". . . . .
. . . . . . . . . . . . . . . . . . . .>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
<xs:element ref="NAZWA"/>
<xs:element name="ID_POLKI" . . . . . . . . . . . . . . . . . . .>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:element>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:element> <!-- ROW -->
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:element> <!-- POLKI -->
<xs:element name="PUDELKA". . . . . .
. . . . . . . . . . . . . . . . . . . .>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
<xs:element name="ROW" . . . .
. . . . . . . . . . . . . . . . . . . .>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
<xs:element ref="NAZWA"/>
<xs:element name="KOLOR".
. . . . . . . . . . . . . . . . . . . .>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:element>
<xs:element name="ID_POLKI" . . . . . . . . . . . . . . . . . . .>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:element>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:element> <!-- ROW -->
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:element> <!-- PUDELKA -->
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:element> <!-- SCOTT -->
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:element> <!-- DB -->
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
</xs:schema> 

这是我创建的xsd,我相信它是等价的?但如果是,那么为什么我不必使用一些空白(我用评论标记它们)?如果我应该使用,我应该在里面写什么?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="poprawka"
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"
    xmlns="poprawka"
    >

    <xs:simpleType name="varchar2_10">
        <xs:restriction base="xs:string">
            <xs:minLength value="0"/>
            <xs:maxLength value="10"/>
        </xs:restriction>
    </xs:simpleType>

 <xs:element name="NAZWA" type="varchar2_10" nillable="false"/>   
   <!-- is that ok, there's a lot of free space left as only for one line of code--> 

<xs:element name="DB">
    <xs:complexType>
     <xs:sequence>
    <xs:element name="SCOTT"> <!--shall I write something inside the element?-->
        <xs:complexType>
        <xs:sequence>
            <xs:element name="POLKI"> <!-- shall I write something inside the element?-->
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="ROW" maxOccurs="unbounded">
                         <xs:complexType>
                             <xs:all>
                                <xs:element ref="NAZWA"/> 
                                 <xs:element name="ID_POLKI"> <!--shall I write something inside the element?-->
                                    <xs:simpleType>
                                        <xs:restriction base="xs:int">
                                            <xs:pattern value="([0-9]){1,3}"/>
                                        </xs:restriction>
                                    </xs:simpleType>
                                </xs:element>
                             </xs:all>
                         </xs:complexType>
                        </xs:element> <!-- ROW -->
                    </xs:sequence>
                </xs:complexType>
            </xs:element> <!-- POLKI -->
            <xs:element name="PUDELKA" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                         <xs:element name="ROW" maxOccurs="unbounded" >
                             <xs:complexType>
                                 <xs:sequence>
                                    <xs:element ref="NAZWA"/>
                                    <xs:element name="KOLOR" type="varchar2_10" minOccurs="0" maxOccurs="1">
                                       <!-- free line, which I don't use -->          
                                    </xs:element>
                                     <xs:element name="ID_POLKI" minOccurs="0" maxOccurs="1">
                                        <xs:simpleType>
                                            <xs:restriction base="xs:int">
                                                <xs:pattern value="([0-9]){1,3}"/>
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:element>
                                 </xs:sequence>
                             </xs:complexType>
                         </xs:element> <!-- ROW -->
                    </xs:sequence>
                </xs:complexType>
                <!-- 4 free lines, and I use only two of them is there something missing --> 
            </xs:element> <!-- PUDELKA -->
        </xs:sequence>
        </xs:complexType>
        <!-- 4 free lines, and I use only two of them is there something missing --> 
    </xs:element> <!-- SCOTT -->
     </xs:sequence>
    </xs:complexType>
    <!-- 4 free lines, and I use only two of them is there something missing -->  
</xs:element> <!-- DB -->
</xs:schema> 

1 个答案:

答案 0 :(得分:0)

架构看起来(大多数)对我来说是正确的。一些观察:

元素PUDELKA被声明为maxOccurs="unbounded" - 这对我来说似乎不对:它对应于一个表,只有一个。

声明这样的3位数整数很奇怪/可能是错误的:

<xs:simpleType>
  <xs:restriction base="xs:int">
    <xs:pattern value="([0-9]){1,3}"/>
  </xs:restriction>
</xs:simpleType>

我只对字符串使用模式限制,对于整数,我会设置最小/最大值:

<xs:simpleType>
  <xs:restriction base="xs:int">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="999"/>
  </xs:restriction>
</xs:simpleType>

编写XSD有许多等效方法,例如复杂类型可以单独声明:

<xs:complexType name="PUDELKATYPE">
  <xs:sequence>
    . . .
  </xs:sequence>
</xs:complexType>

<xs:element name="PUDELKA" type="PUDELKATYPE" maxOccurs="unbounded"/>

或内联(如你所做):

<xs:element name="PUDELKA" maxOccurs="unbounded">
  <xs:sequence>
    . . .
  </xs:sequence>
</xs:element>

这可以解释'未使用的空间'

您可以声明一个命名的简单类型,由ID_POLKIPUDELKA中的两个相同POLKI元素使用 - 或者两者都使用一个命名元素(就像您使用{一样) {1}})。

NAZWA中的{p> ID_POLKI是对PUDELKAID_POLKI的引用 - 您实际上可以使用xs:key和{{3在XSD中声明此类关系元素。