如何为相同的元素名称但不同的子类型完全定义XML模式

时间:2014-07-09 18:41:57

标签: xsd

嗨,再次SO社区,

有关于如何正确定义XSD架构的另一个请求。

鉴于我有一个XML文件,如:

<?xml version="1.0" encoding="UTF-8" ?>
<transformation xmlns="http://www.denktmit.de/pdi/ktr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.w3.org/2001/XMLSchema-instance
./test.xsd">
    <info>
        <name>TrafoName</name>
        <description>TrafoDescription</description>
    </info>
    <changedby>LastUser</changedby>
    <step>
        <type>FileInput</type>
        <description>FileInput Step description</description>
        <FileInputParameterOne>FileInputParam</FileInputParameterOne>
        <another>1</another>
    </step>
    <step>
        <type>Select</type>
        <description>Select Step description</description>
        <SelectParameterOne>SelectParameterOne</SelectParameterOne>
        <SelectParameterTwo>SelectParameterTwo</SelectParameterTwo>
        <another>2</another>
    </step>
</transformation>

这类似于由http://community.pentaho.com/projects/data-integration/

生成的转换文件的样式

如您所见,每个步骤顶部包含几个序列节点

<type>Select</type>
<description>Select Step description</description>

并在底部:

<another>2</another>

在两者之间,可能会出现任意复杂的xml子树。但是,最大限度地出现的最大值取决于“类型”中的值。用例是为具体的Java类存储特定的配置,它们都实现了一个接口,为“type”,“description”和“another”定义了getters / setter,并自己定义了addtional对象结构。只要特定类所需的所有元素都以某种方式存在,忽略顺序也就足够了。

我已经读过:

我试过像

这样的东西
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.denktmit.de/pdi/ktr" elementFormDefault="qualified"
    attributeFormDefault="unqualified" xmlns="http://www.denktmit.de/pdi/ktr">
    <xs:element name="transformation">
        <xs:complexType>
            <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element name="step" type="fileInputStep"></xs:element>
                    <xs:element name="step" type="selectStep"></xs:element>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="stepComplexType" abstract="true"></xs:complexType>

    <xs:complexType name="fileInputStep">
        <xs:complexContent>
            <xs:extension base="stepComplexType">
                <xs:sequence>
                    <xs:element name="type" minOccurs="1"
                        maxOccurs="1">
                        <xs:simpleType>
                            <xs:restriction base="xs:string"></xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="description" type="xs:string"
                        minOccurs="1" maxOccurs="1"></xs:element>
                    <xs:element name="FileInputParameterOne" type="xs:string">
                    </xs:element>
                    <xs:element name="another" type="xs:int" minOccurs="1"
                        maxOccurs="1"></xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="selectStep">
        <xs:complexContent>
            <xs:extension base="stepComplexType">
                <xs:sequence>
                    <xs:element name="type" minOccurs="1"
                        maxOccurs="1">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:pattern value="Select"></xs:pattern>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="description" type="xs:string"
                        minOccurs="1" maxOccurs="1"></xs:element>
                    <xs:element minOccurs="1" name="SelectParameterOne"
                        type="xs:string">
                    </xs:element>
                    <xs:element minOccurs="1" name="SelectParameterTwo"
                        type="xs:string">
                    </xs:element>
                    <xs:element name="another" type="xs:int" minOccurs="1"
                        maxOccurs="1"></xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

但它没有用,告诉我:

  

此行找到多个注释:针对此进行验证   架构,将为这两个粒子创建歧义。      - 开始元素标记      - cos-element-consistent:类型'#AnonType_transformation'的错误。显示名称为“step”且具有不同类型的多个元素   模特组。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用xsd Group。这是一个供您参考的样本

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="transformation">
    <xs:complexType>
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="step" type="stepType"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:complexType name="stepComplexType" abstract="true"></xs:complexType>

<xs:group name="selectParamGroup">
    <xs:sequence>
        <xs:element name="SelectParameterOne" type="xs:string" minOccurs="1" maxOccurs="1">
        </xs:element>
        <xs:element name="SelectParameterTwo" type="xs:string" minOccurs="1" maxOccurs="1">
        </xs:element>
    </xs:sequence>
</xs:group>

<xs:group name="paramGroup">
    <xs:choice>
        <xs:element name="FileInputParameterOne" type="xs:string">
        </xs:element>
        <xs:group ref="selectParamGroup">
        </xs:group>
    </xs:choice>
</xs:group>

<xs:complexType name="stepType">
    <xs:complexContent>
        <xs:extension base="stepComplexType">
            <xs:sequence>
                <xs:element name="type" minOccurs="1"
                    maxOccurs="1">
                    <xs:simpleType>
                        <xs:restriction base="xs:string"></xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element name="description" type="xs:string"
                    minOccurs="1" maxOccurs="1"></xs:element>
                <xs:group ref="paramGroup"></xs:group>
                <xs:element name="another" type="xs:int" minOccurs="1"
                    maxOccurs="1"></xs:element>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
</xs:schema>

XML:

<?xml version="1.0" encoding="UTF-8" ?>
<transformation>
<step>
    <type>FileInput</type>
    <description>FileInput Step description</description>
    <FileInputParameterOne>FileInputParam</FileInputParameterOne>
    <another>1</another>
</step>
<step>
    <type>Select</type>
    <description>Select Step description</description>
    <SelectParameterOne>SelectParameterOne</SelectParameterOne>
    <SelectParameterTwo>SelectParameterTwo</SelectParameterTwo>
    <another>2</another>
</step>
</transformation>