Проблемы с проверкой XML в зависимости от используемого синтаксического анализатора XML ... как мне представить ограничение, которое должно быть общепринятым - PullRequest
4 голосов
/ 10 января 2011

У меня странная ситуация, из-за которой я немного озадачен ....

У меня есть файл данных XML, который я пытаюсь проверить по схеме, которая, кажется, дает разные результаты в зависимости от используемых анализаторов.Не уверен, что я делаю неправильно или как лучше представить ограничения в схеме, чтобы все анализаторы могли правильно проверить XML .... Вот фрагмент проблемной части схемы:

<xsd:element name="DemoValues">
<xsd:annotation>
  <xsd:documentation>Demo values for any, or all, of the demo categories defined on the GAP . A
    demo value includes a reference to the category it applies to, a value in the appropriate
    format and an optional market reference if it is for a specific market. If the market
    reference is omitted the demo value applies to the entire area serviced by the outlet. Each
    demo category may only have a single demo value within this group of demo values. However if
    the demo value is for a market, there may be a demo value per market within this group of
    demo values. </xsd:documentation>
</xsd:annotation>
<xsd:complexType>
  <xsd:sequence>
    <xsd:element name="DemoValue" type="gap:demoValueType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
<xsd:unique name="DemoValueConstraint">
  <xsd:annotation>
    <xsd:documentation>Constraint allows only up to one demo value for a demo category, and per
      market when a market reference exists. </xsd:documentation>
  </xsd:annotation>
  <xsd:selector xpath="gap:DemoValue"/>
  <xsd:field xpath="@demoRef"/>
  <xsd:field xpath="@marketRef|@demoRef"/>
</xsd:unique>

Вот неправильный XML:

<DemoValues>
          <DemoValue demoRef="DM0" marketRef="MKT1">0.40</DemoValue>
          <DemoValue demoRef="DM1">15.00</DemoValue>
</DemoValues>

Выдает эту ошибку:

Элемент '{http://www.AAAA.org/schemas/canadianTVGAP}DemoValue', атрибут' marketRef ': XPath' @marketRef |@demoRef 'поля уникального ограничения идентичности' {http://www.AAAA.org/schemas/canadianTVGAP}DemoValueConstraint' оценивает набор узлов с более чем одним членом.

Упрощенная ошибка: Поле 'marketRef' ожидает самое большее одно значение.

Цель xml - разрешить все эти комбинации:

1)

 <DemoValues>
          <DemoValue demoRef="DM0" marketRef="MKT1">0.40</DemoValue>
          <DemoValue demoRef="DM1">15.00</DemoValue>
 </DemoValues>

2)

<DemoValues>
          <DemoValue demoRef="DM0" marketRef="MKT1">0.40</DemoValue>
          <DemoValue demoRef="DM0" marketRef="MKT2">0.41</DemoValue>
          <DemoValue demoRef="DM0" marketRef="MKT3">0.42</DemoValue>
          <DemoValue demoRef="DM0" marketRef="MKT4">0.43</DemoValue>
          <DemoValue demoRef="DM1">15.00</DemoValue>
</DemoValues>

3)

<DemoValues>
          <DemoValue demoRef="DM0" marketRef="MKT1">0.40</DemoValue>
          <DemoValue demoRef="DM1" marketRef="MKT1">0.41</DemoValue>
          <DemoValue demoRef="DM2" marketRef="MKT1">0.42</DemoValue>
          <DemoValue demoRef="DM3">15.00</DemoValue>
</DemoValues>

Спасибо за любую помощь !!

Ответы [ 2 ]

1 голос
/ 10 января 2011

Я не удивлен, что вы получаете разные результаты от разных процессоров, потому что спецификация написана очень неясно.Однако выражение объединения во втором поле xs: явно неверно - у вас никогда не должно быть поля, в котором можно выбрать более одного узла.Я ожидаю, что оно будет работать правильно, если ваше первое поле - @demoRef, а второе - @marketRef, однако я перечитывал спецификацию и не хотел бы спорить с разработчиком, который интерпретировал его по-другому.

1 голос
/ 10 января 2011

Вам нужно использовать поле здесь по какой-то другой причине, кроме как для ограничения списка атрибутов комбинациями, которые вы описываете?

Элемент XML может иметь не более одного экземпляра любого именованного атрибута. Это факт о XML, независимый от схемы.

В вашем определении gap:demoValueType просто укажите два атрибута, используя <xsd:attribute ... />. Судя по вашим примерам, вы, вероятно, захотите использовать use="required" для определения @demoref)

...