0

在模式 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> 
4

1 回答 1

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_POLKI元素使用,或者声明一个命名的元素供两者使用(就像您对 所做的那样)。PUDELKAPOLKINAZWA

ID_POLKIwithin是对insidePUDELKA的引用——您实际上可以使用and元素在 XSD 中声明这种关系。ID_POLKIPOLKIxs:keyxs:keyref

于 2013-09-06T15:11:27.987 回答