Как сделать элемент в схеме XML, который позволяет любому элементу HTML быть его дочерним элементом? - PullRequest
1 голос
/ 31 мая 2009

Я пытаюсь создать элемент в схеме XML, чтобы в качестве дочерних элементов могли использоваться только стандартные (X) элементы HTML. Я попробовал вот что:

<xs:element name="description">
    <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:any namespace="http://www.w3.org/1999/xhtml" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

Конечно, это не работает, так как следующий XML явно не указывает пространство имен:

<description>
    <p>this is a test</p>
    <p>this is a <b>bold</b> test</p>
    <h1>Those were the tests</h1>
</description>

Нужно ли указывать пространство имен где-то в документе или я могу получить его в схеме?

Ответы [ 3 ]

2 голосов
/ 31 мая 2009

Я думаю, вам нужно отключить обработку контента следующим образом:

  <xs:any namespace="http://www.w3.org/1999/xhtml" processContents="skip"/>

См. раздел 5.5 в спецификации XML-схемы (в частности, примеры)

1 голос
/ 06 июня 2009

Ваша схема выглядит хорошо. Обратите внимание, что значение по умолчанию для xs: any / @ processContents является строгим, что означает, что ваши элементы XHTML также будут проверены, поэтому вам потребуется также схема XHTML и импорт ее из вашей схемы. Вы можете использовать processContents = "lax" внутри xs: any, чтобы указать, что проверка будет применяться только при наличии схемы для этих элементов.

Ваша проблема в том случае, если вы должны указать пространство имен для элемента XHTML. Вы можете объявить пространство имен XHTML в качестве пространства имен по умолчанию для каждого элемента, например

<p xmlns="http://www.w3.org/1999/xhtml">this is a test</p>

или вы можете объявить его связанным с префиксом, например, h, а затем использовать этот префикс для квалификации ваших элементов XHTML:

<description xmlns:h="http://www.w3.org/1999/xhtml">
  <h:p>this is a test</h:p>
  <h:p>this is a <b>bold</b> test</h:p>
  <h:h1>Those were the tests</h:h1>
</description>

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

0 голосов
/ 04 ноября 2009

Я думаю, вам действительно нужно просмотреть эту страницу

...