42

我有以下 XSD 代码:

<xsd:complexType name="questions">
    <xsd:sequence>
        <xsd:element name="location" type="location"/>
        <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="pictureInput" type="pictureInput" minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType>

这里的问题是:元素位置、multipleChoiceInput 等必须按照它们声明的顺序出现。我不希望这种情况发生,我希望在验证过程中,序列不应该是相关的。我怎样才能做到这一点?

我尝试过的另一种可能性是:

<xsd:complexType name="questions">

        <xsd:choice maxOccurs="unbounded">   
            <xsd:element name="location" type="location"/>  
            <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
        </xsd:choice>            

</xsd:complexType>

在这个例子中,顺序真的不再重要了,我可以有很多我想要的元素(“全部”不允许我这样做)。但我仍然有 min- 和 maxOccurs 的问题。在这个例子中,我可以有尽可能多的“pictureInput”,我希望有 0 或 1 的约束条件。

非常感谢您的帮助!

4

3 回答 3

54
<xsd:complexType name="questions">
    <xsd:all>
        <xsd:element name="location" type="location"/>
        <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
        <xsd:element name="textInput" type="textInput"/>
        <xsd:element name="pictureInput" type="pictureInput"/>
    </xsd:all>
</xsd:complexType>

注意:我已将“序列”更改为“全部”

顺序强制顺序(定义)。如果顺序无关紧要,则全部使用。

如果元素多次出现的机会,则可以使用 xsd:any。

<xsd:complexType name="questions">
    <xsd:sequence>
        <xsd:any minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType>

您可以在以下链接中找到 xsd:any 的详细信息:

https://www.w3schools.com/xml/schema_complex_any.asp

于 2010-07-24T14:09:06.137 回答
20

我对这个讨论有点晚了,但我遇到了同样的问题并找到了解决方案:

<xsd:complexType name="questions">
    <xsd:choice maxOccurs="unbounded">
        <xsd:element name="location" type="location"/>
        <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
        <xsd:element name="textInput" type="textInput"/>
        <xsd:element name="pictureInput" type="pictureInput"/>
    </xsd:choice>
</xsd:complexType>

关键是将 xs:choice 与 maxOccurs="unbounded" 结合起来。如果您只使用 xs:all,您可以使用每个句号之一。

编辑添加:虽然 xs:any 会起作用,但它不会将您的选择限制在逐项列出的四个元素中。它将允许任何事情,这几乎违背了模式的目的。

于 2011-12-23T16:56:53.297 回答
1

在这里聚会也很晚了,但会<xsd:all>结合使用minOccurs而不maxOccurs工作吗?:

<xsd:complexType name="questions">
    <xsd:all>
        <xsd:element name="location" type="location" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
    </xsd:all>
</xsd:complexType>
于 2015-05-26T11:11:54.907 回答