Как указать список вариантов в XSD - PullRequest
2 голосов
/ 06 августа 2009

У меня есть определение 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 элементов, уже определенных в файле XML, всякий раз, когда они хотят ввести name значение childEelement?

Эта концепция проявляется при выборе значений атрибутов в XAML или даже в некоторых схемах Visual Studio 2008.

Ответы [ 2 ]

3 голосов
/ 06 августа 2009

Возможно, вы захотите взглянуть на ограничения идентификации , доступные через схему XML. Эти ограничения позволяют применять выражение 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>
0 голосов
/ 06 августа 2009

Вы пробовали элемент <choice/>?

...