0

我是第一次编写 XML 模式,我找到了一些有用的工具来帮助我编写它。

现在我处于一个奇怪的境地。我编写的模式对某些工具有效,而对其他一些工具无效。这个模式是“all”、“sequence”和“group”的混合体。这是我的 XML 架构:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <xsd:group name="test">

        <xsd:all>
                <xsd:element name="e2" minOccurs="0" maxOccurs="1"/>
                <xsd:element name="e3" minOccurs="0" maxOccurs="1"/>
                <xsd:element name="e4" minOccurs="0" maxOccurs="1"/>
        </xsd:all>
    </xsd:group>

    <xsd:element name="e0">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="e1" maxOccurs="unbounded"/>
                <xsd:group ref="test"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

这个架构对吗?它适用于这个验证器这个验证器,但 Notepad++ 的 XML 工具插件显示“无法解析模式文件”。

PS:我写这个模式是因为我想要一个元素“e0”,这样就有可能混合使用e1、e2、e3和e4。e2、e3 和 e4 应该出现 0 或 1 次,而 e1 可能出现无限次。例如,这个 XML 文件应该通过:

<e0>
   <e1/>
   <e1/>
   <e1/>
   <e1/>
   <e1/>
   <e2/>
</e0>

<e0>
   <e2/>
   <e3/>
   <e4/>
</e0>

<e0>
   <e1/>
   <e2/>
   <e3/>
   <e4/>
</e0>

你知道另一种方法吗?

谢谢

4

1 回答 1

5

根据 1.0 版本,您拥有的架构似乎是无效的,该版本在此处(Primer)明确指出

XML Schema stipulates that an all group must appear as the sole child at the top of a content model.

或者,尝试在此处阅读 XML Schema Structures 的第 3.8.6 节。在您的列表中,我将添加 .NET 的 XSD 处理器,在您的情况下会抱怨:

The group ref to 'all' is not the root particle, or it is being used as an extension.

使用 XSD 1.0,除非您为 e1 元素(以下为 e1s)构建包装器,否则没有任何解决方案可以用简洁的语法很好地满足您的需求。

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:group name="test">
        <xsd:all>
            <xsd:element name="e1s" minOccurs="0">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="e1" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="e2" minOccurs="0"/>
            <xsd:element name="e3" minOccurs="0"/>
            <xsd:element name="e4" minOccurs="0"/>
        </xsd:all>
    </xsd:group>
    <xsd:element name="e0">
        <xsd:complexType>
            <xsd:group ref="test"/>
        </xsd:complexType>
    </xsd:element>
</xsd:schema> 

当涉及到 e1 元素时,它们必须被包裹在 e1s 中

<e0>
    <e1s>
        <e1/>
        <e1/>
        <e1/>
        <e1/>
        <e1/>
    </e1s>
    <e2/>
</e0>  

或者

<e0>
    <e1s>
        <e1/>
    </e1s>
    <e2/>
    <e3/>
    <e4/>
</e0>     

然后一切都会验证...

于 2012-05-30T00:38:20.230 回答