В
предыдущих разделах мы рассмотрели ряд механизмов для расширения модели
содержания сложных типов. Например, смешанная модель содержания может включать
в дополнение к элементам произвольные символьные данные. Также модель содержания
может иметь элементы, типы которых импортированы из внешних пространств имен.
Однако эти механизмы обеспечивают очень широкий и очень узкий контроль,
соответственно. Цель данного раздела состоит в том, чтобы описать гибкий
механизм, который дает возможность моделям содержания быть расширенными любыми
элементами и атрибутами, принадлежащими указанному пространству имен.
Для иллюстрации рассмотрим
версию квартального отчета, 4Q99html.xml
, в который мы внедрили данные в нотации
HTML, как часть данных XML. HTML данные появляются в виде содержимого элемента htmlExample, а пространство имен по умолчанию
изменено в самом первом элементе HTML (table
) так, чтобы все элементы HTML
принадлежали пространству имен HTML, http://www.w3.org/1999/xhtml:
Квартальный
отчет с HTML, 4Q99html.xml
<purchaseReport xmlns="http://www.example.com/Report" period="P3M" periodEnding="1999-12-31"> <regions> <!-- part sales listed by zip code, data from 4Q99.xml --> </regions> <parts> <!-- part descriptions from 4Q99.xml --> </parts> <htmlExample> <table xmlns="http://www.w3.org/1999/xhtml" border="0" width="100%"> <tr> <th align="left">Zip Code</th> <th align="left">Part Number</th> <th align="left">Quantity</th> </tr> <tr><td>95819</td><td> </td><td> </td></tr> <tr><td> </td><td>872-AA</td><td>1</td></tr> <tr><td> </td><td>926-AA</td><td>1</td></tr> <tr><td> </td><td>833-AA</td><td>1</td></tr> <tr><td> </td><td>455-BX</td><td>1</td></tr> <tr><td>63143</td><td> </td><td> </td></tr> <tr><td> </td><td>455-BX</td><td>4</td></tr> </table> </htmlExample> </purchaseReport>
Чтобы
разрешить появление HTML в экземпляре документа, мы изменили схему отчета, объявив
новый элемент htmlExample, чье содержание определено элементом any
. В общем случае элемент any
определяет, что любой правильный (well-formed) XML допустим в модели содержания типа. В
примере мы требуем, чтобы XML принадлежал пространству имен http://www.w3.org/1999/xhtml. Другими словами, он должен быть HTML. Также в
примере задано, что, по крайней мере, один элемент должен быть представлен в
этом пространстве имен. На это указывают значения minOccurs
и maxOccurs
:
Изменение
объявления purchaseReport для того, чтобы разрешить HTML в примере
<element name="purchaseReport"> <complexType> <sequence> <element name="regions" type="r:RegionsType"/> <element name="parts" type="r:PartsType"/> <element name="htmlExample"> <complexType> <sequence> <any namespace="http://www.w3.org/1999/xhtml" minOccurs="1" maxOccurs="unbounded" processContents="skip"/> </sequence> </complexType> </element> </sequence> <attribute name="period" type="duration"/> <attribute name="periodEnding" type="date"/> </complexType> </element>
Сделанная модификация разрешает некоторым правильным XML, принадлежащим пространству имен http://www.w3.org/1999/xhtml , появляться в элементе htmlExample. Следовательно, 4Q99html.xml
является допустимым, поскольку есть один элемент, который (со
своими дочерними) является правильным, элемент появляется внутри
соответствующего элемента (htmlExample), и экземпляр документа утверждает, что элемент и его
содержание принадлежат требуемому пространству имен. Однако HTML фактически
может быть не правильным, т.к. в 4Q99html.xml
нет ничего, что бы позволило это гарантировать. Если такая
гарантия требуется, значение атрибута processContents
должно быть установлено в strict
(значение по умолчанию). В этом случае
обработчик XML обязан
получить схему, связанную с требуемым пространством имен и проверить
правильность HTML, представленного в элементе htmlExample.
В другом примере, мы определяем тип text
, который подобен текстовому типу,
определенному в предварительной библиотеке типов XML Schema (см. также Раздел 5.4.1),
и является подходящим для интернационального, доступного для чтения человеком
текста. Текстовый тип позволяет неограниченно смешивать символьное содержание и
содержание элемента из любых пространств имен, например аннотации Ruby, наряду с дополнительным атрибутом xml:lang. Значение
lax
атрибута
processContents
инструктирует обработчик XML на то, чтобы проверить правильность содержания элемента,
основываясь на следующем правиле: “Проверять правильность элементов и
атрибутов, для которых можно получить информацию схемы, но не воспринимать
ситуацию как ошибочную, если нельзя получить какую-либо информацию схемы”.
Текстовый тип
<xsd:complexType name="text"> <xsd:complexContent mixed="true"> <xsd:restriction base="xsd:anyType"> <xsd:sequence> <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute ref="xml:lang"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType>
Пространство
имен может использоваться для того, чтобы разрешить и запретить содержание
элемента различными способами в зависимости от значения атрибута namespace
, как показано в Таблице 4:
Значение атрибута пространства имен |
Допустимое содержание элемента |
##any |
Любой
правильный XML из любого
пространства имен (по умолчанию) |
##local |
Любой правильный
XML, который не квалифицирован,
т.е. не объявлен в пространстве имен |
##other |
Любой правильный
XML, который не из
целевого пространства имен определяемого типа |
"http://www.w3.org/1999/xhtml
##targetNamespace" |
Любой правильный
XML, принадлежащий любому
пространству имен в списке (разделенном пробелами); ##targetNamespace это стенография для целевого пространства
имен определяемого типа |
В дополнение к
элементу any
, который допускает содержание элемента в
соответствие с пространством имен, существует соответствующий элемент anyAttribute
, который предоставляет возможность
атрибутам появляться в элементах. Например, мы можем разрешить любому атрибуту
HTML появиться как часть элемента htmlExample, добавляя anyAttribute
к его объявлению:
Изменение
объявления htmlExample, которое позволяет атрибуты HTML
<element name="htmlExample"> <complexType> <sequence> <any namespace="http://www.w3.org/1999/xhtml" minOccurs="1" maxOccurs="unbounded" processContents="skip"/> </sequence> <anyAttribute namespace="http://www.w3.org/1999/xhtml"/> </complexType> </element>
Данное объявление разрешает атрибут
HTML, посредством href, появляться в элементе htmlExample. Например:
Атрибут HTML в элементе htmlExample
.... <htmlExample xmlns:h="http://www.w3.org/1999/xhtml" h:href="http://www.example.com/reports/4Q99.html"> <!-- HTML markup here --> </htmlExample> ....
Атрибут namespace
в элементе anyAttribute
может быть установлен для любого из значений элемента any
, перечисленных в Таблице 4, и anyAttribute
может быть определен с атрибутом processContents
. В отличие от элемента any
, anyAttribute
не может сдержать значение атрибутов, которые могут появиться в
элементе.