【问题标题】:XML Schema for attribute or subnode属性或子节点的 XML 模式
【发布时间】:2012-04-09 08:34:04
【问题描述】:

这是我的问题。在一个节点中,我希望有一个属性或一个子节点(来自一个组)。例如:

<set_variable name="bob" value="3/>

<set_variable name="bob">
    <.../>
</set_variable>

我发现这样做的唯一方法是:

<xs:element name="set_variable" type="setVariableType"/>

<xs:complexType name="setVariableType">
    <xs:sequence minOccurs="0" maxOccurs="1">
        <xs:group ref="arithmeticGroup"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="value" type="xs:integer" use="optional"/>
</xs:complexType>

<xs:group name="arithmeticGroup">
    ....
</xs:group>

该解决方案的问题在于它允许两种禁止的方式:

<set_variable name="bob"/> <!-- Should at least have an attribute or a subnode -->

<set_variable name="bob" value="18"> <!-- Should not have both attribute and a subnode -->
    <.../>
</set_variable>

有人有想法吗?

【问题讨论】:

    标签: xml validation xsd xml-validation


    【解决方案1】:

    不幸的是,这在 XSD 1.0 中是不可能的;您要么必须在 XSD 1.0 之上使用 Schematron 断言,要么依赖 XSD 1.1 assertionstype alternatives(刚刚在 4 月 5 日作为 W3C rec 伪造)和兼容的处理器(没有免费的,很少可用)。

    【讨论】:

    • @13ren,我已经用 XSD 1.1 断言的链接更新了答案。无法实现 XSD 1.0 所要求的事实与如何在 1.0 中定义内容模型有关。没有涉及属性的内容模型选择的概念(选择只处理粒子)。 XSD 1.1 现在支持它 - 请参阅 Type Alternatives。至于被广泛采用的程度,这完全取决于主要参与者进入的速度。微软在这个领域没有表现出任何努力......
    • (续)... XSD2Code 绑定技术在某些情况下几乎无法支持核心 XSD 1.0;更不用说那些不是专门用于 XSD 编辑的企业建模工具,而是广泛用于与 XSD 相关的任务 - 企业使用正在推动这方面的发展。就我个人而言,我认为 XSD 1.1 不会仅仅因为时间问题而获得与 1.0 相当的成功。当 1.0 到来时,周围没有某种 - 工具和框架。现在有这么多,最低的公分母会占上风……我希望被证明是错误的……
    • @PetruGardea 谢谢!我查看了断言和类型替代方案 - 非常复杂。当 XSD 出现时,DTD 已经建立(恕我直言,它的语法也更好)——但 XSD 解决了 DTD 未满足的需求。所以我想这取决于 XSD 1.1 是否满足重要需求——是否存在“差距”。顺便说一句:This answer(底部)建议使用像&lt;xs:field xpath="definition|@ref"/&gt; 这样的键选择器,我认为基于它必须评估为 exactly one 节点的想法 - 但当我使用xmllint 对其进行了测试。
    • @13ren,DTD 并不难替换。在我看来,从 DTD 到 XSD 的发展在很多层面上都是必要的,它带来了很多优势,首先是使用 XML 语法这一事实。我可以从我自己的经验中转达,XSD 1.1 的许多改进在我的咨询实践中遇到了阻力。一个特别的主题是断言的使用,虽然现在它非常强大,但它让具有 BRMS 背景的人担心我们将打开大门,重新开始在任何地方编写业务规则......在使用 XSD 1.0 之前,没有有很多值得担心的......
    • (续)@13ren;不幸的是,您链接的答案不适用于您的情况。虽然这是一个不错的尝试(他错过了最重要的部分,definition 元素的本质),但问题在于 xs:field 与 xs:selector 不同。前者必须解析为一些非空文本。它仅在 (definition) 元素是简单类型或具有简单内容时才有效。所以说你的场景(arithmeticGroup),它不会工作。
    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多