我在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>
答案 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>