0

这就是我定义具有替代类型的元素的方式。

替代.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  elementFormDefault="qualified"
  vc:minVersion="1.1">

    <xs:complexType name="DefaultType">
        <xs:sequence>
            <xs:element name="string" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="OtherType">
        <xs:sequence>
            <xs:element name="number" type="xs:integer"/>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="root">
        <xs:alternative test="@switchTo = 'OtherType'" type="OtherType"/>
        <xs:alternative type = "DefaultType"/>
    </xs:element>

</xs:schema>

样本A.xml

<?xml version="1.1" encoding="UTF-8"?>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="alternative.xsd">

    <string>
        Sample
    </string>

</root>

样本B.xml

<?xml version="1.1" encoding="UTF-8"?>

<root switchTo="OtherType"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="alternative.xsd">

    <number>
        23571113
    </number>

</root>

首先,我的验证器都不支持它,所以我切换到 Oxygen XML 进行评估。它验证所有内容,并且类型解析和验证适用于每个替代方案,但我收到一个错误:

属性 'switchTo' 不允许出现在元素 'apply' 中。

我知道没有为元素“root”定义属性,但我也不知道应该在哪里定义它!我以探索的方式尝试了各个地方,但没有运气。感谢您的时间。

4

1 回答 1

1

如果你为元素设置了不同的复杂类型,那么你的复杂类型需要声明你想要赋予元素的属性:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
    elementFormDefault="qualified"
    vc:minVersion="1.1">

    <xs:complexType name="DefaultType">
        <xs:sequence>
            <xs:element name="string" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="switchTo" type="xs:string"/>
    </xs:complexType>

    <xs:complexType name="OtherType">
        <xs:sequence>
            <xs:element name="number" type="xs:integer"/>
        </xs:sequence>
        <xs:attribute name="switchTo" type="xs:string"/>
    </xs:complexType>

    <xs:element name="root">
        <xs:alternative test="@switchTo = 'OtherType'" type="OtherType"/>
        <xs:alternative type = "DefaultType"/>
    </xs:element>

</xs:schema>
于 2018-02-04T19:49:49.830 回答