限制要在外部/而不是根元素之外使用的全局元素

时间:2011-01-27 09:39:50

标签: xsd

我在xsd架构中定义了一些全局元素。现在,如果xml文件单独包含任何全局元素(没有任何其他根元素),则验证不应允许此操作。但在我的情况下,如果只存在全局元素,则验证文件成功。

在我的例子中,有GROUP元素是一个全局元素。此元素应始终包含在CASE元素中,但如果删除CASE元素,则xml文件仍会成功验证。

我不能将GROUP元素作为本地元素,因为它有一些复杂的逻辑(递归调用自身)并在多个地方使用。此外,当我试图将它作为本地时,它给了我错误。

现在有任何解决办法限制它不能在CASE元素之外使用。

实施例(允许):

<?xml version="1.0" encoding="utf-8" ?>
<CASE>
   <GROUP>
   </GROUP>
 </CASE>

不允许:

<?xml version="1.0" encoding="utf-8" ?>
<GROUP>
</Group>  

3 个答案:

答案 0 :(得分:1)

很抱歉,XML Schema中无法指定哪个全局元素是唯一允许作为根的元素。您可能需要查看其他技术来验证此要求(例如嵌入Schematron规则

答案 1 :(得分:1)

您可以尝试一种解决方法:将<GROUP>元素包含在<xs:group name="someName">元素中,以便该组仅包含您的<GROUP>元素。 (呃,由于这些名称而有点令人困惑......)在这种情况下,无论何时需要引用全局<GROUP>元素,都应该引用“someName”组。

如果您的递归元素定义很复杂,则此解决方法可能不适用于您。

答案 2 :(得分:1)

您是否尝试将Group元素设为local,但是为其提供了一个允许递归和重用的全局类型?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Case" type="CaseType"/>
  <xs:complexType name="CaseType">
    <xs:sequence>
      <xs:element name="Group" type="GroupType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="GroupType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Group" type="GroupType"/>
      <xs:element name="Case" type="CaseType"/>
    </xs:choice>
  </xs:complexType>
</xs:schema>