代码之家  ›  专栏  ›  技术社区  ›  NicoBerrogorry

XML 1.1中xs:alternative的正确用法

  •  0
  • NicoBerrogorry  · 技术社区  · 7 年前

    这就是我如何用可选类型定义元素的方法。

    可供替代的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>
    

    萨姆莱克。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”定义属性,但我也不知道应该在哪里定义它!我以探索的方式尝试了不同的地方,但没有成功。感谢您抽出时间。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Martin Honnen    7 年前

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

    <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>