【问题标题】:xsd equivalent to dtdxsd 相当于 dtd
【发布时间】:2013-09-09 02:26:45
【问题描述】:

在 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,我相信它是等效的吗?但如果是,那么为什么会有一些我不必使用的间隙(我用 cmets 标记了它们)?如果我应该使用,我应该在里面写什么?

<?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> 

【问题讨论】:

    标签: xsd dtd


    【解决方案1】:

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

    元素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>
    

    这可能是“未使用空间”的原因

    您可以声明一个命名的简单类型供PUDELKAPOLKI 中的两个相同的ID_POLKI 元素使用 - 或两者都使用一个命名的元素(就像您对NAZWA 所做的那样)。

    PUDELKA 中的ID_POLKIPOLKI 中的ID_POLKI 的引用——实际上,您可以使用xs:keyxs:keyref 元素在XSD 中声明这种关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-13
      • 2021-08-27
      • 2014-06-02
      • 2018-08-22
      • 2017-04-12
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多