4

在 XSD 中,<complextType> 可以具有属性 'block' 和 'final',它们可以采用 #all 值或扩展或限制列表。这些属性是什么意思?我们如何使用它们?

我无法从W3C 对 XSD 1.1 的推荐中得到明确的答案。有人可以给我一些例子吗?

4

2 回答 2

12

与 XML Schema 的情况一样,非规范的“入门”提供了比规范规范更清晰的解释。在这种情况下,“控制派生类型的创建和使用”final部分有一个block关于不同类型地址的工作示例。

本质上,final意味着该类型根本不能有任何子类型(使用适当的派生样式),而block表示该类型可以有子类型,但是当元素被声明为阻塞类型时,该元素必须是明确声明的类型,而不是子类型。

于 2014-10-02T09:25:32.240 回答
0

使用 eclipse XSD/XML 验证功能使用规范中可用的示例 XSD 和 XML 片段完成的示例测试:

  1. 使用final限制类型的派生

<< ipo.xsd >>

<schema targetNamespace="http://www.example.com/IPO" xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:ipo="http://www.example.com/IPO">
<complexType name="Address" block="extension">
    <sequence>
        <element name="name" type="string" />
        <element name="street" type="string" />
        <element name="city" type="string" />
    </sequence>
</complexType>
<complexType name="USAddress">
    <complexContent>
        <extension base="ipo:Address">
            <sequence>
                <element name="state" type="ipo:USState" />
                <element name="zip" type="positiveInteger" />
            </sequence>
        </extension>
    </complexContent>
</complexType>
<complexType name="UKAddress">
    <complexContent>
        <extension base="ipo:Address">
            <sequence>
                <element name="postcode" type="ipo:UKPostcode" />
            </sequence>
            <attribute name="exportCode" type="positiveInteger" fixed="1" />
        </extension>
    </complexContent>
</complexType>
<!-- other Address derivations for more countries -->
<simpleType name="USState">
    <restriction base="string">
        <enumeration value="AK" />
        <enumeration value="AL" />
        <enumeration value="AR" />
        <!-- and so on ... -->
    </restriction>
</simpleType>
<!-- simple type definition for UKPostcode -->
<simpleType name="UKPostcode">
    <restriction base="string">
        <enumeration value="PO16" />
        <enumeration value="G41" />
        <enumeration value="WC1A" />
        <!-- and so on ... -->
    </restriction>
</simpleType>
....
....

ipo.xsd验证错误的屏幕截图

  1. 使用块限制可以在实例文档中使用哪些派生

<< ipo.xsd >>

<schema targetNamespace="http://www.example.com/IPO" xmlns="http://www.w3.org/2001/XMLSchema"
            xmlns:ipo="http://www.example.com/IPO">   
      <complexType name="Address" block="extension">
        <sequence>
          <element name="name" type="string"/>
          <element name="street" type="string"/>
          <element name="city" type="string"/>
        </sequence>
      </complexType>
      <complexType name="USAddress">
        <complexContent>
          <extension base="ipo:Address">
            <sequence>
              <element name="state" type="ipo:USState"/>
              <element name="zip" type="positiveInteger"/>
            </sequence>
          </extension>
        </complexContent>
      </complexType>
      <complexType name="UKAddress">
        <complexContent>
          <extension base="ipo:Address">
            <sequence>
              <element name="postcode" type="ipo:UKPostcode"/>
            </sequence>
            <attribute name="exportCode" type="positiveInteger" fixed="1"/>
          </extension>
        </complexContent>
      </complexType>
      .....
      .....
    </schema>


<< ipo.xml >>

<?xml version="1.0"?>
<ipo:purchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ipo="http://www.example.com/IPO"
                   orderDate="1999-12-01"
                   xsi:schemaLocation="http://www.example.com/IPO ipo.xsd">

  <shipTo  xsi:type="ipo:UKAddress" exportCode="1">
    <name>Helen Zoe</name>
    <street>47 Eden Street</street>
    <city>Cambridge</city>
    <postcode>WC1A</postcode>
  </shipTo>
  <billTo xsi:type="ipo:USAddress">
    <name>Robert Smith</name>
    <street>8 Oak Avenue</street>
    <city>Old Town</city>
    <state>AL</state>
    <zip>95819</zip>
  </billTo>
  <items>
    <item partNum="833-AA">
      <productName>Lapis necklace</productName>
      <quantity>1</quantity>
      <USPrice>99.95</USPrice>
      <ipo:comment>Want this for the holidays!</ipo:comment>
      <shipDate>1999-12-05</shipDate>
    </item>
  </items>
</ipo:purchaseOrder>

ipo.xml验证错误的屏幕截图
请注意,对于第二种情况,ipo.xsd 验证没有显示错误(使用 block="extension")。

于 2018-04-15T16:21:45.753 回答