我可以重新定义 XSD 架构来更改类型的子项的 maxOccurs 属性吗? [英] Can I redefine an XSD Schema to change the maxOccurs attribute of a child of a type?

查看:24
本文介绍了我可以重新定义 XSD 架构来更改类型的子项的 maxOccurs 属性吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to extend an XML schema to change the number of times a child can occur under an element.

在原始模式中,父类型是这样定义的:

In the original schema, the parent type is defined as such:

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

我想让 CrimeScheduleCrimeMoneyAndSecurities 都是重复元素.我认为这可能有效(在 xsd:redefine 内):

I want to make it so both CrimeSchedule and CrimeMoneyAndSecurities are repeating elements. I thought this might work (inside of 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>

但是,然后我收到以下错误:

However, then I get the following error:

cos-nonambig:CrimeSchedule 和 CrimeSchedule(或它们替换组中的元素)违反了唯一粒子属性".在针对此模式进行验证期间,这两个粒子会产生歧义.

cos-nonambig: CrimeSchedule and CrimeSchedule (or elements from their substitution group) violate "Unique Particle Attribution". During validation against this schema, ambiguity would be created for those two particles.

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

This makes sense, since those children were indeed defined in the original schema. So, how can I accomplish what I need to do?

谢谢!

推荐答案

当您进行扩展时,新类型的内容模型是基础内容模型和您在新类型中添加的任何内容的序列.例如,在您的情况下,重新定义的 CrimeLineBusiness_Type 类型的内容模型是

When you make an extension the content model of the new type is a sequence of the content model of the base and whatever you add in your new type. For example in your case the content model for the redefined CrimeLineBusiness_Type type is

<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 和 CrimeMoneyAndSecurities 元素,然后通过扩展再次添加这些元素,并具有所需的出现次数.请参阅下面的完整工作示例:

What you can try to achieve what you want is a double redefinition of that type. First you redefine it by restriction, removing the optional CrimeSchedule and CrimeMoneyAndSecurities elements and then by extension adding those elements again with the desired number of occurrences. See below a full working sample:

文本.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

A valid XML instance, 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 架构来更改类型的子项的 maxOccurs 属性吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆