Схема XML - введите последовательность - PullRequest
0 голосов
/ 10 октября 2009

Я пытаюсь ввести ключ в последовательности, и меня забрасывают ошибками. Кажется, я не могу этого сделать. Кроме того, мне говорят, что моему ключу нужны поле и селектор, о которых я смог найти очень мало документации. (На самом деле, в отчаянии я скачал Liquid XML Studio [против Notepad] и искал в ее файлах справки ... чтобы найти НЕТ даже ссылку на слово «селектор») Независимо от того, какой еще способ я могу использовать для гарантии уникальности , не нулевое значение для элемента в последовательности? (Содержимое, о котором идет речь, является строкой)

Обратите внимание, что без ключевого элемента схема проверяется.

Ошибка

Схема

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 targetNamespace="READOO" elementFormDefault="qualified">

  <xs:element name="ReferralCollection">
    <xs:complexType>
      <xs:sequence>
    <xs:key name="URL" type="string" />
        <xs:element maxOccurs="unbounded" name="keyword">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="occurrences" type="xs:int" use="required" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

Ответы [ 2 ]

2 голосов
/ 10 октября 2009

Элемент key не должен входить в элемент sequence. Вместо этого вы указываете его как потомок xs:element, который определяет ReferralCollection. selector и field являются дочерними элементами элемента key, которые определяют, что должно быть уникальным. Оба являются выражениями XPath. Значение selector устанавливает контекст XPath, а элементы field (их может быть больше одного) определяют комбинацию значений, которые должны быть уникальными. Так что в вашем случае элемент key может выглядеть примерно так:

<xs:key name="URL">
  <xs:selector xpath="."/>
  <xs:field xpath="rd:keyword"/>
</xs:key>

selector здесь выбирает сам элемент, то есть ReferralCollection. Затем в этом контексте элемент field обозначает значения элементов keyword, которые, таким образом, должны быть уникальными. Значением элемента в XPath является его текстовое содержимое.

Я не так много сделал с элементами key (или с XML-схемой в целом), поэтому некоторые приведенные выше детали могут быть неверными, но основная идея заключается в том, что я объяснил, поэтому должно быть легко исправить любые ошибки, которые я сделал. О, также обратите внимание, что я использовал префикс rd для вашего пространства имен READOO; По моему опыту, использование явных префиксов всегда лучше при работе с XPath, поэтому для этой работы необходим соответствующий атрибут xmlns:rd в вашей схеме.

РЕДАКТИРОВАТЬ: Так что, кажется, вы хотите что-то вроде этого:

<xs:element name="ReferralCollection">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="URL" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="stem" type="xsd:string"/>
            <xs:element name="keyword" maxOccurs="unbounded">
            ...
            </xs:element>
          ...
  </xs:complexType>

  <xs:key name="URL">
    <xs:selector xpath="./URL"/>
    <xs:field xpath="stem"/>
  </xs:key>
</xs:element>

Это ближе к тому, что вы имели в виду? Он содержит URL элементов, один или несколько, каждый из которых содержит элемент stem, за которым следует один или несколько keyword элементов. Ограничение key должно сделать содержимое элементов stem уникальным.

0 голосов
/ 10 октября 2009

Пожалуйста, посмотрите, могут ли эти ссылки помочь вам:

РЕДАКТИРОВАТЬ : Я построил схему ниже несколько лет назад; пожалуйста, посмотрите, как она вписывается в вашу проблему:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="urn:asp4d"
    xmlns:asp4d="urn:asp4d">
  <xs:element name="ASP4Developers">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Links" minOccurs="1" maxOccurs="1">
          <xs:keyref name="kUserId" refer="asp4d:UserId">
            <xs:selector xpath="Link"/>
            <xs:field xpath="@UserId"/>
          </xs:keyref>
        </xs:element>
      </xs:sequence>
    </xs:complexType>

    <xs:key name="UserId">
      <xs:selector xpath="Users/User"/>
      <xs:field xpath="@UserId"/>
    </xs:key>

  </xs:element>

</xs:schema>
...