Написание XML-схемы для псевдо-HTML - PullRequest
1 голос
/ 01 ноября 2011

Я пытаюсь написать схему для какого-то XML, похожего на HTML. Он содержит теги imageвнутри тегов (aragraph). Проблема в том, что они могут быть в любом порядке:

<p> <u><b>test</u><b> </p>

или

<p> <b><u>test</u></b> </p>.

Я пытаюсь создать сложный тип со ссылками на себя, но всегда получаю ошибки "неверная схема". Если кто-нибудь может подсказать мне правильный путь, я был бы очень признателен.

Схема:

<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Хороший шаблон проектирования для этого - использовать абстрактные элементы и группы подстановки. Определите модель содержимого textElements как <xs:element ref="inline" maxOccurs="unbounded"/>. Определите inline как абстрактный элемент. Определите элементы b, i, u и т. Д., Чтобы они были в группе подстановки inline. Определите модель содержимого для встроенных текстовых элементов.

Преимущество этого подхода заключается в том, что вы (или ваши преемники) можете добавлять новые элементы в группу замещения в любое время, не влияя на существующие определения.

1 голос
/ 01 ноября 2011

Гааа, прокляни тебе XML-схему!

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

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:element name="HTMLDocument">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="textElements" mixed="true">
            <xs:group ref="textElementGroup" minOccurs="0" maxOccurs="unbounded"/>
    </xs:complexType>

    <xs:group name="textElementGroup">
        <xs:choice>
            <xs:element name="b" type="textElements" minOccurs="0" maxOccurs="1"/>
            <xs:element name="i" type="textElements" minOccurs="0" maxOccurs="1"/>
            <xs:element name="u" type="textElements" minOccurs="0" maxOccurs="1"/>
            <xs:element name="a" type="textElements" minOccurs="0" maxOccurs="1"/>
            <xs:element name="font" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="textElements">
                            <xs:attribute name="size" type="xs:string"/>
                            <xs:attribute name="face" type="xs:string"/>
                            <xs:attribute name="color" type="xs:string"/>
                        </xs:extension>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="img" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:attribute name="src" type="xs:string"/>
                    <xs:attribute name="width" type="xs:decimal"/>
                    <xs:attribute name="height" type="xs:decimal"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
    </xs:group>

</xs:schema>

РЕДАКТИРОВАТЬ: о, похоже, вам не нужна эта дополнительная xs: sequence.Я возьму это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...