XSD中的'final'和'block'属性是什么意思?

时间:2014-10-02 08:55:34

标签: xml xsd xsd-validation xsd-1.1

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

我无法从the W3C recommendation for XSD 1.1得到明确答案。有人可以给我一些例子吗?

2 个答案:

答案 0 :(得分:11)

XML Schema的情况经常如此,非规范的#34;引物"提供了比规范性规范更清晰的解释。在这种情况下,"controlling the creation and use of derived types"部分在不同类型的地址方面都有finalblock的工作示例。

基本上,final表示该类型根本不具有任何子类型(具有适当的派生样式),而block表示类型可以具有子类型但是当一个元素声明为阻塞类型,那么该元素必须是特定的声明类型,而不是子类型。

答案 1 :(得分:0)

使用eclipse XSD / XML验证功能在规范中提供的示例XSD和XML片段进行的示例测试:

  1. 使用最终
  2. 限制类型的派生

    <<的 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>
    ....
    ....
    

    Screenshot of ipo.xsd validation errors

    1. 使用阻止
    2. 限制在实例文档中使用哪种派生

      &LT;&LT;的 ipo.xsd &GT;&GT;

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


      &LT;&LT;的 ipo.xml &GT;&GT;

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

      Screenshot of ipo.xml validation errors
      请注意,ipo.xsd验证显示第二种情况没有错误(使用block =“extension”)。