5.5 Элемент Any, атрибут Any

В предыдущих разделах мы рассмотрели ряд механизмов для расширения модели содержания сложных типов. Например, смешанная модель содержания может включать в дополнение к элементам произвольные символьные данные. Также модель содержания может иметь элементы, типы которых импортированы из внешних пространств имен. Однако эти механизмы обеспечивают очень широкий и очень узкий контроль, соответственно. Цель данного раздела состоит в том, чтобы описать гибкий механизм, который дает возможность моделям содержания быть расширенными любыми элементами и атрибутами, принадлежащими указанному пространству имен.

Для иллюстрации рассмотрим версию квартального отчета, 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:

 

Таблица 4. Атрибут пространства имен в Any

Значение атрибута пространства имен

Допустимое содержание элемента

##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 не может сдержать значение атрибутов, которые могут появиться в элементе.

 

Сайт создан в системе uCoz