xml – 有没有办法将语义与语义结合起来?

我有一个类似于以下的文档类型:

<foo>
  <settings>
    <!-- Must be present; in any order -->
    <time>abc</time>
    <validRun>true</validRun>
    <!-- Tool may add whatever ones it wants -->
    <somethingNotCheckedFor>abc</somethingNotCheckedFor>
  </settings>
</foo>

以下文档在语义上与前面的文档相同:

<foo>
  <settings>
    <validRun>true</validRun>
    <somethingNotCheckedFor>abc</somethingNotCheckedFor>
    <time>abc</time>
  </settings>
</foo>

但以下内容无效:

<foo>
  <settings>
    <validRun>true</validRun>
    <somethingNotCheckedFor>abc</somethingNotCheckedFor>
    <!-- Error: required element "time" not present -->
  </settings>
</foo>

我尝试了类似下面的内容,但这不起作用,因为< xs:all>不允许包含< xs:any>:

<xs:all>
  <xs:element name="time" />
  <xs:element name="validRun" />
  <xs:any />
</xs:all>

在W3C Schema中有没有办法做到这一点?

解决方法

>您可以使用XSD 1.1,它允许通配显示在所有组中.
>如果您所需的元素位于命名空间中,并且您可以要求生成添加的元素不在该命名空间中,那么您可以使用可识别所需语言的选项和序列来编写内容模型(如果您确实只需要两个元素,它不是太难;如果你有三个或四个它变得很麻烦,如果你有五个以上,你不想在没有编译器的情况下这样做).你需要的是这样的内容模型:

<xs:sequence>
  <xs:any namespace="##other" 
          minOccurs="0" 
          maxOccurs="unbounded"/>
  <xs:choice>
    <xs:sequence>
      <xs:element ref="time"/>
      <xs:any namespace="##other" 
              minOccurs="0" 
              maxOccurs="unbounded"/>
      <xs:element ref="validRun"/>
    </xs:sequence>
    <xs:sequence>
      <xs:element ref="validRun"/>
      <xs:any namespace="##other" 
              minOccurs="0" 
              maxOccurs="unbounded"/>
      <xs:element ref="time"/>
    </xs:sequence>
  </xs:choice>
  <xs:any namespace="##other" 
          minOccurs="0" 
          maxOccurs="unbounded"/>
</xs:sequence>

>您可以使用仅包含松散重复通配符的内容模型声明设置,并在应用程序级别(1)检查它是否包含time和validRun以及(2)这两个子项是否有效.

其中,如果您可以使用XSD 1.1验证器,我认为XSD 1.1可能会产生最满意的结果.目前,Xerces J和Saxon-EE都支持XSD 1.1;大多数其他XSD工具没有.

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念