代码之家  ›  专栏  ›  技术社区  ›  pkaeding

我可以重新定义XSD模式来更改类型的子级的maxOccurs属性吗?

  •  7
  • pkaeding  · 技术社区  · 17 年前

    在原始架构中,父类型定义如下:

    <xsd:complexType name="CrimeLineBusiness_Type">
        <xsd:complexContent>
            <xsd:extension base="PCLINEBUSINESS">
                <xsd:sequence>
                    <xsd:element ref="CrimeSchedule" minOccurs="0"/>
                    <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    

    我想让这两者都成为现实 CrimeSchedule CrimeMoneyAndSecurities 是重复的元素。我想这可能会奏效(在 xsd:redefine ):

        <xsd:complexType name="CrimeLineBusiness_Type">
            <xsd:complexContent>
                <xsd:extension base="CrimeLineBusiness_Type">
                    <xsd:sequence>
                        <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0" maxOccurs="unbounded"/>
                        <xsd:element ref="CrimeSchedule" minOccurs="0" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    

    但是,我得到了以下错误:

    cos nonambig:CrimeSchedule和CrimeSchedule(或其取代基中的元素)违反了“唯一粒子属性”。 在根据该模式进行验证期间,将为这两个粒子创建歧义。

    这是有意义的,因为这些子项确实是在原始模式中定义的。那么,我怎样才能完成我需要做的事情呢?

    谢谢

    1 回复  |  直到 14 年前
        1
  •  12
  •   George Bina    17 年前

    当您进行扩展时,新类型的内容模型是基本内容模型的序列,以及您在新类型中添加的任何内容。例如,在您的案例中,重新定义的CrimeLineBusiness_类型的内容模型是

    <xsd:sequence>
      <xsd:sequence>
        <xsd:element ref="CrimeSchedule" minOccurs="0"/>
        <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0"/>
      </xsd:sequence>
      <xsd:sequence>
        <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="CrimeSchedule" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:sequence>
    

    你可以尝试实现你想要的是对这种类型的双重重新定义。首先,通过限制重新定义它,删除可选的CrimeSchedule和CrimeMoneyandSecurity元素,然后通过扩展以所需的出现次数再次添加这些元素。请参阅下面的完整工作示例:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
      <xsd:element name="test" type="CrimeLineBusiness_Type"/>
    
      <xsd:complexType name="PCLINEBUSINESS"/>
      <xsd:element name="CrimeSchedule"/>
      <xsd:element name="CrimeMoneyAndSecurities"/>
    
      <xsd:complexType name="CrimeLineBusiness_Type">
        <xsd:complexContent>
          <xsd:extension base="PCLINEBUSINESS">
            <xsd:sequence>
              <xsd:element ref="CrimeSchedule" minOccurs="0"/>
              <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0"/>
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
    
    </xsd:schema>
    

    redef1.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:redefine schemaLocation="test.xsd">
    
        <xs:complexType name="CrimeLineBusiness_Type">
          <xs:complexContent>
            <xs:restriction base="CrimeLineBusiness_Type">
              <xs:sequence/>
            </xs:restriction>
          </xs:complexContent>
        </xs:complexType>
      </xs:redefine>
    </xs:schema>
    

    redef2.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:redefine schemaLocation="redef1.xsd">
        <xs:complexType name="CrimeLineBusiness_Type">
          <xs:complexContent>
            <xs:extension base="CrimeLineBusiness_Type">
              <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="CrimeSchedule"/>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="CrimeMoneyAndSecurities"/>
              </xs:sequence>
            </xs:extension>
          </xs:complexContent>
        </xs:complexType>
      </xs:redefine>
    </xs:schema>
    

    有效的XML实例test.XML

    <?xml version="1.0" encoding="UTF-8"?>
    <test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="redef2.xsd">
    
      <CrimeSchedule></CrimeSchedule>
      <CrimeSchedule></CrimeSchedule>
      <CrimeMoneyAndSecurities></CrimeMoneyAndSecurities>
      <CrimeMoneyAndSecurities></CrimeMoneyAndSecurities>
    
    </test>
    

    当做 乔治