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

Xml 我可以重新定义XSD模式来更改类型的子级的maxOccurs属性吗?,xml,xsd,Xml,Xsd,我试图扩展XML模式,以更改子元素在元素下出现的次数 在原始架构中,父类型定义如下: <xsd:complexType name="CrimeLineBusiness_Type"> <xsd:complexContent> <xsd:extension base="PCLINEBUSINESS"> <xsd:sequence> <xsd:element ref="

我试图扩展XML模式,以更改子元素在元素下出现的次数

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

<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>
但是,我得到了以下错误:

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

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


谢谢

当您进行扩展时,新类型的内容模型是基本内容模型的序列,以及您在新类型中添加的任何内容。例如,在您的案例中,重新定义的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元素,然后通过扩展以所需的出现次数再次添加这些元素。请参阅下面的完整工作示例:

text.xsd

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

问候,,
乔治

伟大的解释和解决方案乔治!在看到一些关于XSD被投票并被提问者接受的错误答案后,我开始对它失去信心。我来到这里是为了寻找“我可以通过重新定义删除一个孩子吗?”的答案,但我认为乔治的答案也间接地涵盖了这一点,回答是“不,不能不使用与上述类似的模式”。
<?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>