代码之家  ›  专栏  ›  技术社区  ›  Mike J

如何在XSD中指定选项列表

  •  2
  • Mike J  · 技术社区  · 15 年前

    我有一个XSD定义,它有一个标记元素列表。在为选项限制元素输入值时,如何允许开发人员只从XML文件中已定义的元素列表中进行选择?

    换句话说,给定这个XML声明:

    <collection>
          <myItem name="Item_1">
            <childElement />
          </myItem>
    
          <myItem name="Item_2">
            <childElement>
              <item name="Item_1"/>
            </childElement>
          </myItem>
    
          <myItem name="Item_3">
            <childElement>
              <item name="Child_2"/>
            </childElement>
          </myItem>
    </collection>
    

    ... 这个XSD定义

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="collection">
        <xs:complexType>
          <xs:sequence>
            <xs:element maxOccurs="unbounded" name="collection">
              <xs:complexType>
                <xs:sequence minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="childElement" >
                    <xs:complexType>
                      <xs:sequence  minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="item">
                          <xs:complexType>
                            <xs:attribute name="name" type="xs:string" use="optional" />
                          </xs:complexType>
                        </xs:element>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
    
                <xs:attribute name="name" type="xs:string" use="required"/>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    myItem 只要元素要进入 name 价值 childEelement ?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Steve Guidi    15 年前

    你可以看看 identity constraints 可通过XML模式获得。这些约束允许您应用XPath表达式来表示给定元素的唯一性约束和引用约束。

    尽管我的语法可能缺少一个 <sequence> <complexType> 定义。我还没有验证过这一点,但是我们的想法是为您希望约束到的值创建一个“key”,然后在您希望约束的元素中引用带有“key ref”的key。

    <xs:element name="myItem">
      <xs:complexType>
        <xs:attribute name="name" type="xs:string" use="optional"/>
        <xs:key name="itemNameKey">
          <xs:selector xpath="myItem"/>
          <xs:field xpath="@name"/>
        </xs:key>
      </xs:complexType>
    </xs:element>
    
    <xs:element name="childElement">
      <xs:complexType>
        <xs:attribute name="name" type="xs:string" use="optional"/>
        <xs:keyref name="itemConstraint" refer="itemNameKey">
          <xs:selector xpath="childElement"/>
          <xs:field xpath="@name"/>
        </xs:key>
      </xs:complexType>
    </xs:element>
    
        2
  •  0
  •   Ionuț G. Stan    15 年前

    <choice/> 元素?