XSD уникален: почему field / @ xpath = "." не работа? - PullRequest
1 голос
/ 07 апреля 2020

У меня проблема при проверке некоторых уникальных ограничений в XML с использованием XSD. (Я проверяю с помощью XMLlint) У меня есть следующая структура:

<xsd:element name="elem" type="elemType" >
      <xsd:unique name="uniqueJob">
        <xsd:selector xpath=".//jobs/job"/>
        <xsd:field xpath="."/>
    </xsd:unique>
</xsd:element>

Где задания имеют сложный тип, глубоко вложенный в <elem> (я использую <jobs> более одного раза, поэтому я определил ограничение в root -элем):

       <xsd:complexType name="jobType">
            <xsd:sequence>
                <xsd:element name="job" minOccurs="0" maxOccurs="3" />
            </xsd:sequence>
        </xsd:complexType>

Теперь моя проблема заключается в следующем: если у меня есть что-то вроде

            <jobs>
                <job>Programmer</job>
                <job>Scientist</job>
            </jobs>

, оно как-то не проверяется. Я получаю следующую ошибку из XMLlint: Element 'job': The XPath './/jobs/job' of a field of unique identity-constraint 'uniqueJob' does evaluate to a node of non-simple type., но 'job' - простой тип. Что мне здесь не хватает? Заранее спасибо!

PS: я хочу добиться, чтобы в каждом теге <jobs> каждая работа была уникальной.

1 Ответ

1 голос
/ 07 апреля 2020

Изменить

    <xsd:selector xpath=".//jobs/job"/>
    <xsd:field xpath="."/>

на

    <xsd:selector xpath=".//jobs"/>
    <xsd:field xpath="job"/>

Пояснение

  • Первый требует, чтобы job элементы были уникальными в пределах своей области действия - всегда в любом случае.

  • Второй требует, чтобы job элементы были уникальными в пределах области видимости. их родительские jobs элементы - скорее всего, ваше реальное намерение.

См. также

...