属性或子节点的XML架构

属性或子节点的XML架构,xml,validation,xsd,xml-validation,Xml,Validation,Xsd,Xml Validation,这是我的问题。在节点中,我希望有一个属性或一个子节点(来自组)。例如: <set_variable name="bob" value="3/> 不幸的是,这在XSD 1.0中是不可能的;您要么必须在XSD 1.0之上使用Schematron断言,要么依赖XSD 1.1或(4月5日刚刚伪造为W3C rec)和兼容处理器(没有免费的,很少有可用的)。@13ren,我已经用XSD 1.1断言的链接更新了答案。不可能实现XSD1.0所要求的功能,这与1.0中如何定义内容模型有关。没有涉及属

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

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

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

@13ren,我已经用XSD 1.1断言的链接更新了答案。不可能实现XSD1.0所要求的功能,这与1.0中如何定义内容模型有关。没有涉及属性的内容选择模型的概念(选择仅处理粒子)。XSD1.1现在支持它-请参阅。至于采用的范围有多广,这完全取决于主要参与者进入市场的速度。微软在这个领域没有表现出任何努力…(续)。。。XSD2Code绑定技术在某些情况下几乎无法支持核心XSD1.0;我们甚至不必讨论企业建模工具,这些工具不专门用于XSD编辑,但被广泛用于与XSD相关的任务,而企业使用正推动着这一点。就我个人而言,我认为XSD1.1不会因为时间原因而与1.0取得类似的成功;当1.0出现时,周围什么都没有——工具和框架。现在有这么多,最低的公分母将占上风一段时间。。。我希望被证明是错的。@PetruGardea谢谢!我研究了断言和类型选择——非常复杂。当XSD出现时,DTD就已经建立起来了(还有更好的语法IMHO),但XSD解决了DTD无法满足的需求。所以我想这取决于XSD1.1是否满足了重要的需求——是否存在“差距”。顺便说一句:(底部)建议使用像
这样的键选择器,我认为基于这样的想法,它必须精确计算一个节点-但当我使用
xmllint
@13ren测试它时,它不起作用,DTD并不难替换。在我看来,从DTD到XSD在很多层面上都是必要的,它带来了很多好处,首先是使用了XML语法。根据我自己的经验,XSD1.1中的许多改进在我的咨询实践中遇到了阻力;一个特别的主题是断言的使用,虽然现在断言的功能非常强大,但它让具有BRMS背景的人担心,我们将打开大门,重新开始在任何地方编写业务规则。。。在使用XSD1.0之前,没什么好担心的…(续)@13ren;不幸的是,您链接的答案在您的案例中不起作用。虽然这是一次很好的尝试(他忽略了最重要的部分,
定义
元素的性质),但它的问题在于xs:field与xs:selector不同;前者必须解析为一些非空文本。仅当(
定义
)元素为简单类型或具有简单内容时,它才起作用。因此,对于您的场景(算术组),它将不起作用。
<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>