如何在XSD中指定选项列表

时间:2009-08-06 15:21:55

标签: xml xsd schema constraints

我有一个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的{​​{1}}值时,从XML文件中已定义的name元素列表中进行选择?

在XAML甚至某些Visual Studio 2008的模式中选择属性值时会出现这个概念。

2 个答案:

答案 0 :(得分:3)

您可能希望查看通过XML架构提供的identity constraints。这些约束允许您应用XPath表达式来表示给定元素的唯一性和引用约束。

尽管我的语法可能缺少<sequence><complexType>定义,但您应该可以编写类似下面的内容。我没有验证这一点,但想法是为你想要约束的值创建一个“键”,然后在你想要约束的元素中引用带有“key-ref”的键。

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

答案 1 :(得分:0)

您是否尝试过<choice/>元素?