XML 架构,为什么 xs :group can't be child of xs:all?

标签 xml xslt xsd

根据this page (以及我的实践),xs:group 元素不能是 xs:all 的子元素。 所以像

<xs:group name="g">
    <xs:element name="first" type="xs:string"/>
    <xs:element name="last" type="xs:string"/>
</xs:group>
<xs:all>
    <xs:group ref="g" minOccurs="0" maxOccurs="1"/>
    <xs:element name="id" type="xs:string"/>
</xs:all>

无效,因为组不能位于 xs:all 内。但我想定义一个模式,其中两个元素(上例中的 firstlast)同时存在或都不存在,所以我将它们放入一个组中。然后我想让该组成为 xs:all 的一部分,因为该组可以以任何顺序与其他元素(例如上面的 id 元素)一起出现。换句话说,我希望有几个元素作为一个整体是可选的。如果 xs:group 无法成为 xs:all 的子级,我该如何实现这一目标?

最佳答案

XML Schema 1.0 only permits xs:all 下的 xs:element(和 xs:annotation)。

<all
  id = ID
  maxOccurs = 1 : 1
  minOccurs = (0 | 1) : 1
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, element*)
</all>

它不允许 xs:groupxs:sequencexs:choice

XML Schema 1.1 permits xs:all 下的 xs:elementxs:anyxs:group:

<all
  id = ID
  maxOccurs = (0 | 1) : 1
  minOccurs = (0 | 1) : 1
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, (element | any | group)*)
</all>

注意:允许无序元素可能听起来很理想,但很少真正需要。通常 xs:sequence 在实践中就足够了。

如果您愿意放弃无序要求,您可以(即使在 XSD 1.0 中)要求 firstlast 为“两者都存在或都不存在”,如下所示如下:

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

  <xs:element name="a">
    <xs:complexType>
      <xs:sequence>
        <xs:sequence minOccurs="0">
          <xs:element name="first" type="xs:string"/>
          <xs:element name="last" type="xs:string"/>
        </xs:sequence>
        <xs:element name="id" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

关于XML 架构,为什么 xs :group can't be child of xs:all?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33698600/

相关文章:

xml - xsl 标识符与索引的关联

java - 如何将 XML 文档作为参数传递给 java (oracle xdk) 中的 XSL 转换?

java - JAXB SchemaFactory 源顺序必须遵循模式之间的导入顺序?

xsd - XML 架构 : How to define a key/keyref for different elements in same group?

XML 架构 : Setting a default value for a complexType?

java - 使用 Sax 解析器处理 XML 中的空标记,Java

android - 了解 android 对话框布局

python - 从外籍人士的解析错误中优雅地恢复

xml - 将新节点添加到一组现有节点 (Perl XML::LibXML)

.net - 如何声明返回节点集的用户定义函数?