XML验证>显示特定枚举值的新元素

时间:2014-02-25 16:12:13

标签: xml validation xsd

我想创建一个模式,强制跨相关元素进行内容验证。如果第一个元素的内容是“ApplicationY”,那么下一个元素必须是可见的和必需的。

<?xml version="1.0" encoding="utf-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Instructions">
    <xs:complexType>
      <xs:sequence>

        <xs:element name="Applications" >
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Application" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="ApplicationName">
                      <xs:simpleType>
                        <xs:restriction base="xs:token">
                          <xs:enumeration value="ApplicationX"/>
                          <xs:enumeration value="ApplicationY"/>
                          <xs:enumeration value="ApplicationZ"/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>

                    <xs:element name="NextElementOnlyForApplicationY">
                      <xs:simpleType>
                        <xs:restriction base="xs:token">
                          <xs:enumeration value="Yes"/>
                          <xs:enumeration value="No"/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>

                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

1 个答案:

答案 0 :(得分:0)

架构无法做到这一点。架构可以做两件事:

  1. 确保在其他元素中存在某些元素或属性
  2. 确保任何元素的内容在其自己的上下文中有效
  3. 架构无法对元素强制执行另一个元素的内容。

    你可以做的是创建一个抽象的基本元素Application,它有更多的特定元素(例如ApplicationY)代替它们。更具体的元素可能需要额外的子元素或属性。

    架构:

    <?xml version="1.0" encoding="utf-8"?>
    
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://mynamespace" targetNamespace="http://mynamespace">
        <xs:element name="Instructions">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="Applications" >
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element ref="my:Application" maxOccurs="unbounded"/>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    
        <xs:element name="Application" abstract="true" />
        <xs:element name="ApplicationX" substitutionGroup="my:Application" />
        <xs:element name="ApplicationY" substitutionGroup="my:Application">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="ElementForApplicationY">
                        <xs:simpleType>
                            <xs:restriction base="xs:token">
                                <xs:enumeration value="Yes"/>
                                <xs:enumeration value="No"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="ApplicationZ" substitutionGroup="my:Application" />
    
    </xs:schema>
    

    文件:

    <?xml version="1.0" encoding="utf-8"?>
    <my:Instructions xmlns:my="http://mynamespace">
        <Applications>
            <my:ApplicationX />
            <my:ApplicationY>
                <ElementForApplicationY>Yes</ElementForApplicationY>
            </my:ApplicationY>
            <my:ApplicationZ />
        </Applications>
    </my:Instructions>
    

    请注意,使用替换组要求元素是模式级元素,而不是内部元素。这意味着您需要定义命名空间。