Q. Как описать рекурсивность с помощью схем?

 Как описать  с помощью xschema рекурсивную вложенность.
 Например, элемент"Equipment" содержит один или несколько других
 элементов "Equipment". Таким образом, элемент является как
 контейнером, так и контентом.  Нет никакого ограничения на количество
 под-уровней (вложенности).
  

A [flax]. island модератор |Altova Support Forums предложил следующее решение

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
 
    <xs:element name="equipment" type="equpimenttype">
    </xs:element>
 
    <xs:complexType name="equpimenttype">
        <xs:sequence>
            <xs:element ref="equipment"/>
        </xs:sequence>
    </xs:complexType>
 
</xs:schema>

A [flax]. Martin Honnen приводит следующую иллюстрацию описания рекурсивности с помощью схем

Требуемый xml

<?xml version="1.0" encoding="UTF-8"?>
<element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="test2005031301Xsd.xml">
   <child-element />
   <element>
     <childElement />
     <element>
       <element />
     </element>
   </element>
</element>

Схема

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   version="1.0">
 
<xs:element name="element">
   <xs:complexType>
     <xs:sequence>
       <xs:any processContents="skip" minOccurs="0" />
       <xs:element ref="element" minOccurs="0" />
     </xs:sequence>
   </xs:complexType>
</xs:element>
 
</xs:schema>

Таким образом, вы можете использовать <xs:element ref чтобы сослаться на сам элемент.

 And you need to make sure that somewhere the recursion can stop, meaning 
 the nested element needs to be allowed to not occur where needed for 
 instance with minOccurs="0".

Также, вы должны убедиться, что рекурсия где-либо может остановиться, т.е. вложенным элементам должно быть разрешено не появляться там, где находятся сущности с minOccurs=“0”

A [flax]. C. M. Sperberg-McQueen предлагает следующий наглядный пример:

Here is a simple schema for documents with titles, paragraphs, and sections (tagged ‘doc’, ‘title’, ‘p’, and ‘div’), in which sections are recursive (i.e. ‘div’ elements can contain ‘div’ elements).

<xsd:schema 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns="http://example.com/simple-recursive-example"
 targetNamespace="http://example.com/simple-recursive-example" >
 
 <xsd:element name="doc" type="T-div"/>
 <xsd:element name="div" type="T-div"/>
 <xsd:element name="p"/>
 <xsd:element name="title"/>
 
 <xsd:complexType name="T-div">
  <xsd:sequence>
   <xsd:element ref="title"/>
   <xsd:element ref="p" minOccurs="0" maxOccurs="unbounded"/>
   <xsd:element ref="div" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
 </xsd:complexType>
 
</xsd:schema>

Here is a document using that schema:

<my:doc xmlns:my="http://example.com/simple-recursive-example"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation
      ="http://example.com/simple-recursive-example ruthless.xsd">
 
  <my:title>Simple document showing recursion</my:title>
  <my:p>This document illustrates the 'simple recursive example' schema.</my:p>
  <my:p>    The identity of structure between 'doc' and 'div' elements
            is captured in the schema by using the same complex type (T-div)
            for both the 'doc' element and the 'div' element.
  </my:p>
 
  <my:div>
     <my:title>The 'document' element</my:title>
     <my:p>The document contains a title, a series of paragraphs, 
           and a series of 'div' elements.
     </my:p>
  </my:div>
  <my:div>
     <my:title>The 'div' element</my:title>
     <my:p> 
         Like the 'doc' element, any 'div' element
         can contain a title (required), a series of zero or more aragraphs,
         and a series of zero or more 'div' elements.
     </my:p>
     <my:div>
       <my:title>The parallel between doc and div</my:title>
       <my:p>
            The identity of structure between 'doc' and 'div' elements
            is captured in the schema by using the same complex type (T-div)
            for both the 'doc' element and the 'div' element.
       </my:p>
   </my:div>
   <my:div>
       <my:title>The <my:title>recursion</my:title></my:title>
       <my:p>The ability of 'div' elements to contain other 'div' elements
            is expressed in the schema by the simple expedient of naming the
            'div' element as a possible child of the 'div' element.
       </my:p>
   </my:div>
</my:div>
</my:doc>

Note that because they are implicitly declared as having the ur-type (type xsd:anyType), the ‘title’ and ‘p’ elements can also self-nest, as illustrated in the last ‘my:title’ element.

I hope this helps.

A [flax]. Рекурсивность в RelaxNG (Van der Vlist)

category = element category{
  element title{text},
  category *,
  book*
 }
   Note that in this case, the recursive reference to the category named pattern must be optional. Otherwise the
   document would be required to have an infinite depth!
 
  faq/recursive_schema.txt · Последние изменения: 2012/03/27 05:15
 
Нас поддерживают: экран для проектора . Кликни купить пальто женское - 1mvo.ru. . Доставка грузов Коноша перевозка грузов Коноша www.megtranscom.ru. Рейтинг@Mail.ruliveinternet.ru