在xs:all中使用xs:group

时间:2014-04-09 13:49:04

标签: xml xsd

我正在尝试定义我的XSD,但我遇到了元素问题。

这是我的XML:

<key>Lambda, People</key>
<dict>
<key>Cost Center</key>
<string>  186B Hello Street, Mangilao</string>
<key>Organisation Path</key>
<string>NOA/NOZ</string>
<key>Phone Number</key>
<string>+1340232103</string>
<key>Room Number</key>
<string>GUM Sales</string>
<key>VoIP</key>
<string></string>
<key>title</key>
<string>Lambda, People</string>
</dict>

以下是我想用于XSD的内容:

<!-- <key>title</key><string>...</string> -->
<xs:group name="key_string_title">
<xs:sequence>
    <!-- <key>title</key> -->
    <xs:element name="key" type="xs:string" fixed="title"/>
    <!-- <string>...<string> -->
    <xs:element name="string" type="xs:string"/>                
</xs:sequence>
</xs:group>
<!-- <key>title</key><string>...</string> -->


<!-- <key><string> -->
<xs:group name="key_string">
<xs:sequence>
    <!-- <key>...</key> -->
    <xs:element name="key" type="xs:string"/>
    <!-- <string>...<string> -->
    <xs:element name="string" type="xs:string"/>                
</xs:sequence>
</xs:group>
<!-- <key><string> -->


<!-- <key><dict> Staff -->
<xs:group name="key_dict_staff">
<xs:sequence>
    <!-- <key> -->
    <xs:element name="key" type="xs:string"/>

    <!-- <dict> -->
    <xs:element name="dict">
        <xs:complexType>
            <xs:all>                
                <!-- <key>title</key><string>...</string> -->
                        <xs:group ref="key_string_title"/>

                <!-- <key><string> -->
                <xs:group ref="key_string" minOccurs="0" maxOccurs="unbounded"/>

            </xs:all>
        </xs:complexType>
    </xs:element>
    <!-- </dict> -->

</xs:sequence>
</xs:group>
<!-- </key></dict> Staff -->

不幸的是,我发现在all元素中使用group元素是不可能的。考虑到这一点,我怎么能这样做呢?我在方法中遗漏了什么吗?

1 个答案:

答案 0 :(得分:2)

我想你要说的是,必须有一个“标题”,它可以在序列的任何地方。你肯定不能这样做:你违反了XSD中的许多规则,例如“元素声明一致”规则,如果两个兄弟元素具有相同的名称,那么它们必须具有相同的类型。

你当然可以在XSD 1.1中使用断言来完成它。在XSD 1.0中可能有一些使用唯一性约束的创造性方法,但是如果有的话我就看不到了。

我的方法是将XML实例重新设计为更卫生的东西。请记住,在验证之前总是可以选择转换。