首页 > 解决方案 > xsd 文件:不能有同名的元素序列

问题描述

我想将一个 Excel 文件导出为 XML,如下所示:

<Data form="DTA_CAL">
  <Item>
    <Dim prop="SII_TAX_COL">010</Dim>
    <Dim prop="SII_TAX_DEC">1010.15</Dim>
    <Dim prop="SII_TAX_RUB">010</Dim>
  </Item>
  <Item>
    <Dim prop="SII_TAX_COL">010</Dim>
    <Dim prop="SII_TAX_DEC">2010</Dim>
    <Dim prop="SII_TAX_RUB">020</Dim>
  </Item>
</Data>

但是我无法拥有一个正确的 xsd 来允许具有相同名称的元素序列,我尝试了这个:

<xs:element name="Data">

       <xs:complexType>
              <xs:sequence>
                     <xs:element name="Item"  maxOccurs="3">
                            <xs:complexType>
                                <xs:all>
                                    <xs:element name="Dim" >
                                        <xs:complexType>
                                                <xs:simpleContent>
                                                    <xs:extension base="xs:string">
                                                         <xs:attribute name="prop" type="xs:string" fixed="SII_TAX_COL">
                                                         </xs:attribute>
                                                    </xs:extension> 
                                                </xs:simpleContent> 
                                        </xs:complexType>
                                    </xs:element>
                                    <xs:element name="Dim">
                                        <xs:complexType>
                                                <xs:simpleContent>
                                                    <xs:extension base="xs:string">
                                                         <xs:attribute name="prop" type="xs:string" fixed="SII_TAX_DEC">
                                                         </xs:attribute>
                                                    </xs:extension> 
                                                </xs:simpleContent> 
                                        </xs:complexType>
                                    </xs:element>
                                    <xs:element name="Dim">
                                        <xs:complexType>
                                                <xs:simpleContent>
                                                    <xs:extension base="xs:string">
                                                         <xs:attribute name="prop" type="xs:string" fixed="SII_TAX_RUB" >
                                                         </xs:attribute>
                                                    </xs:extension> 
                                                </xs:simpleContent> 
                                        </xs:complexType>
                                    </xs:element>                                                               
                                </xs:all>
                            </xs:complexType>
                    </xs:element>
            </xs:sequence>
        </xs:complexType>
</xs:element>

但是当我上传这个 XSD 文件时出现错误,我不能在一个序列中的 3 个元素中使用相同的名称“Dim”。

我怎样才能有 XSD 来描述这个 XML?

标签: xmlxsd

解决方案


您不能定义三个具有相同名称的元素。您只能定义一个元素并使用 和 限制其minOccurs出现maxOccurs。您可以将属性值限制为一个序列。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="Data">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Item" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Dim" minOccurs="3" maxOccurs="3">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="prop" use="required">
                                                <xs:simpleType>
                                                    <xs:restriction base="xs:string">
                                                        <xs:enumeration value="SII_TAX_COL"/>
                                                        <xs:enumeration value="SII_TAX_DEC"/>
                                                        <xs:enumeration value="SII_TAX_RUB"/>
                                                    </xs:restriction>
                                                </xs:simpleType>
                                            </xs:attribute>
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="form" type="xs:string" use="required" fixed="DTA_CAL"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

但以上并不能保证属性值是唯一的。如果您希望它们是唯一的,则必须添加唯一约束。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="Data">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Item" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Dim" minOccurs="3" maxOccurs="3">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="prop" use="required">
                                                <xs:simpleType>
                                                    <xs:restriction base="xs:string">
                                                        <xs:enumeration value="SII_TAX_COL"/>
                                                        <xs:enumeration value="SII_TAX_DEC"/>
                                                        <xs:enumeration value="SII_TAX_RUB"/>
                                                    </xs:restriction>
                                                </xs:simpleType>
                                            </xs:attribute>
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                    <xs:unique name="Dim_prop">
                        <xs:selector xpath="Dim"/>
                        <xs:field xpath="@prop"/>
                    </xs:unique>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="form" type="xs:string" use="required" fixed="DTA_CAL"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

如果您以这种方式组织 XML,则处理会更容易:

<Data form="DTA_CAL">
  <Item>
    <Dim SII_TAX_COL="010" SII_TAX_DEC="1010.15" SII_TAX_RUB="010"/>
  </Item>
</Data>

推荐阅读