1

有没有办法在引用该类型的地方定义该类型的基数?

<xs:complexType name="xyType">
  <xs:element name="xy" maxOccurs="1">
            <xs:choice maxOccurs="1" minOccurs="0">
                <xs:complexType>
                    <xs:choice maxOccurs="unbounded" minOccurs="0">
                        ...
                    </xs:choice>
                </xs:complexType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

因此,例如,我有两种类型 A 和 B 具有引用此类型的元素,但在一种情况下,我只允许一个 xy(如上),另一种我想允许多个 xy(如我将上面的 maxOccurs 更改为 xy到“无界”)。

我不想完全分离 xyType(单一)和 xyType(无界)的 complexType 定义,因为实际上这种类型的定义非常长且复杂。

如果可能的话,我也不想定义太多类型(比如将内部 complexType 与主体分开并有两种类型引用该类型)。在我的特定场景中,这也将非常复杂(我有一个复杂的类层次结构,我尝试使用模式定义,所以一切都已经臃肿)。

所以基本上我正在寻找引用这种类型的类型关心基数的东西,如果这有意义的话。

4

2 回答 2

1

我建议您将 s 的部分xyType尽可能模块化,以便在两种类型之间共享,比如xyType_A只允许一种类型,xy并且xyType_B允许无限数量的xys。(当然选择语义上合适的名称而不是这些替代品。)

例如,xyType_A并且它们对' 基数xyType_B的定义可能不同,但共享 中定义的复杂机制:xycommonType

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="xyType_A">
    <xs:sequence>
      <xs:element name="xy"  type="commonType" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="xyType_B">
    <xs:sequence>
      <xs:element name="xy"  type="commonType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="commonType">
    <xs:choice maxOccurs="1" minOccurs="0">
      <xs:sequence>
        <xs:choice maxOccurs="unbounded" minOccurs="0">
          <!-- further complicated structures continue here -->
        </xs:choice>
        <!-- and here or wherever -->
     </xs:sequence>
    </xs:choice>
  </xs:complexType>

</xs:schema>

如果不同基数的元素在定义层次结构中更深,则原则(如果不是机会的大小)将是相同的:尽可能多地考虑通用定义组件,并在明确定义的类型中重用它们。

于 2013-10-29T17:12:16.037 回答
0

这在 XSD 1.0 中不起作用。您可以使用 Schematron(在 XSD 1.0 之上);它可以毫无问题地工作。

在 XSD 1.1 中是可能的。至少根据我的理解,这需要一些工作。解决方案是使用断言;但是,它们似乎只支持复杂类型和简单类型,这意味着您可能仍需要引入两种特定于元素 A 和 B 的新类型;然而,他们只是扩展 xyType(100% 重用),目的是提供一个地方来定义特定于 A 和 B 的断言。

如果您对任一替代方案感兴趣,请适当地标记问题。

于 2013-10-29T15:57:22.957 回答