Пример использования проверки XML-схемы - PullRequest
0 голосов
/ 04 августа 2011

У меня есть простой XML-формат для метасов

<?xml version="1.0" encoding="utf-8"?>

<metas>
<meta type="date">
    <code>storage_date</code>
    <value>12-02-1989</value>
</meta>
<meta type="int">
    <code>weight</code>
    <value>12</value>
</meta>
<meta type="bool">
    <code>foo</code>
    <value>true</value>
</meta>
<meta type="text">
    <code>bar</code>
    <value>Hello world</value>
</meta>    
</metas>

Я хочу иметь схему, которая учитывает мой метатип и проверяет, зависит ли это от даты или текста int bool.

Пока у меня есть

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="metas" type="metasType" />
  <xsd:complexType name="metasType">
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" name="meta" type="metaType" />
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="metaType">
    ???
</xsd:schema>

Возможно ли то, что я пытаюсь сделать, чтобы проверить схемы?

1 Ответ

0 голосов
/ 11 августа 2011

Итак, вы хотите, чтобы атрибут type в метаэлементе управлял содержимым метаэлемента.Один из способов сделать это:

  1. позволить metaType быть пустым типом
  2. создать новый тип по расширению из metaType для каждой возможности
  3. иметь атрибут typeдля элемента meta это xsi: type
  4. значение атрибута type должно идентифицировать фактический используемый подтип metaType

Например, вы определяете meta_int как подтип metaType.Когда вы определите элемент value там, он будет иметь тип xs: int.Тогда вы получите в своем XML:

<meta xsi:type="meta_int">
  <code>weight</code>
  <value>12</value>
</meta>

Другой подход заключается в использовании других имен элементов, а не атрибута типа (например, элемента meta_int).Затем вы можете использовать группу выбора для выбора между различными элементами meta_ *.

Еще одним подходом может быть использование утверждений, но это особенность XSD 1.1, которая еще не является официальной (AFAIK).

Я не уверен, что вы делаете, но я думаю, что было бы справедливо сказать, что в XSD имена элементов, как правило, наиболее полезны для управления следующим контентом, тогда как вы пытаетесь сделать это с помощьюатрибут.

...