【问题标题】:XSD either one element or the otherXSD 一个元素或另一个
【发布时间】:2014-05-19 17:23:48
【问题描述】:

在 XSD 模式中,我知道我可以定义序列或元素、元素的选择或所需的集合,而不必按逐字顺序排列,但是有没有办法说复杂类型应该具有任一元素 John或者元素 Jack,或者没有元素,并且只有当元素 John 存在时,元素 Anna 是否可以在与 John 相同的嵌套级别被指定一次(但不是必需的)?

可能的情况:

<John /> | <John /> | <Jack /> | <!-- Neither. -->
           <Anna /> |          | 

如果是的话,我想下面的说法也应该可以说:

<FolderPath /> | <MainFilePath />      | <!-- Neither. -->
               | <Sidekick1FilePath /> |
               | <SideKick2FilePath /> |

同样,两者都不是必需的,但是一旦指定了文件夹,就不能存在任何文件,并且当指定了所有文件时,不能指定文件夹。不能只指定一个或两个文件,一个文件夹或三个文件或什么都不指定。

【问题讨论】:

    标签: xml xslt schema xsd


    【解决方案1】:

    您可以通过嵌套选项和序列来实现这一点。可选内容(您的示例中的“两者都没有”)使用minOccurs="0" 基数完成。基数限制可用于元素声明或集合,如&lt;xs:choice&gt; 下面的示例类型。

    <xs:complexType name="something">
        <xs:choice minOccurs="0">
            <xs:sequence>
                <xs:element name="John" type="xs:string" />
                <xs:element minOccurs="0" name="Anna" type="xs:string" />
            </xs:sequence>
            <xs:element name="Jack" type="xs:string" />
        </xs:choice>
    </xs:complexType>
    

    【讨论】:

    • 完美!它工作得很好,但现在我对如何指定选择应该是外部序列的一部分感到困惑。这样我就可以拥有 John+-Mikki、John 和 Anna+-Mikki、Jack+-Mikki 或只有 Mikki。我尝试将其放入 :all 中,但没有成功。
    • 由于声誉低,无法投票支持您的答案。很抱歉。
    • 没关系,我将使用 xs:sequence 并强制执行元素的顺序。再次感谢。
    • 如果您在第一条评论中仍然需要有关组合的帮助,请更新您的问题。由于 cmets 中的格式化可能性有限,很难弄清楚您的意思是哪种组合。作为一般建议,尝试在有限状态机中形成所需的订单或考虑适当的正则表达式保持(它们是确定性的)。这样的解决方案通常相对容易转换为模式代码。
    • 非常感谢,感谢您的帮助。但是,我对您提供的解决方案没有意见。我在写之前的评论时想到的东西是不可能实现的,因为它不是确定性的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2011-05-06
    • 1970-01-01
    • 2019-05-31
    • 2020-08-21
    相关资源
    最近更新 更多