2015-03-26 2 views
0

Я новичок в XSD так, что мой вопрос может выглядит как очевидная, но, во всяком случае ...XSD вложенного элемента рекурсия

Рассматривайте У меня есть следующий XML:

<om:model xmlns:om="http://www.r-style.com/2014/odm-model"> 
    <om:entry> 
     <om:key>KEY1</om:key> 
     <om:value>VALUE1</om:value> 
    </om:entry> 
    <om:entry> 
     <om:key>KEY2</om:key> 
     <om:value>VALUE2</om:value> 
    </om:entry> 
    <om:entry> 
     <om:key>KEY3<om:key> 
     <om:value> 
      <om:model> 
       <om:entry> 
        <om:key>KEY4</om:key> 
        <om:value>VALUE4</om:value> 
       </om:entry> 
       <om:entry> 
        <om:key>KEY5</om:key> 
        <om:value>VALU5E</om:value> 
       </om:entry> 
      </om:model> 
     </om:value> 
    </om:entry> 
</om:model> 

Есть способ создать такую ​​схему XSD, чтобы указать, что в теге разрешено устанавливать либо реальное значение (типа String), либо вставлять сам XML. В результате я хотел бы иметь пару пары ключ-значение или ключ-xml, и что xml также должен содержать такие вещи, как пара ключей или пара-ключ-xml. Etc ...

Спасибо за ваше время!

P.S .: на данный момент я попытался использовать следующую XSDSchema, но все равно придется уверен, правильно ли это или в настоящее время:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.r-style.com/2014/odm-model"> 
    <xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" name="model" type="odm:modelType"/> 
    <xs:complexType name="entryType"> 
    <xs:sequence> 
     <xs:element type="xs:string" name="key"/> 
     <xs:element name="value"> 
     <xs:complexType mixed="true"> 
      <xs:sequence> 
      <xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:modelType" name="model" minOccurs="0"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="modelType"> 
    <xs:sequence> 
     <xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:entryType" name="entry" maxOccurs="unbounded" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="valueType"> 
    <xs:sequence> 
     <xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:modelType" name="model" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
+0

Да, это возможно. Но, пожалуйста, предоставьте нам правильный XML в качестве входных данных и XSD, который вы уже пытались создать. – potame

+0

Пожалуйста, ** отредактируйте ** свое сообщение, чтобы добавить код. С этим трудно что-то сделать. – potame

+0

'отредактировал сообщение – SergeZ

ответ

1

Ваша схема выглядит нормально для меня; он должен хорошо работать для того, что вы хотите сделать.

Как точность, установка модели содержимого, как текста или некоторых тегов исключительно в XML не представляется возможным. Вам нужно использовать смешанную модель контента, и всегда можно вставлять какой-либо текст, даже если вставлен <om:model>.

Чтобы избежать этого, вы можете обернуть текстовое содержимое <om:value> в тег, например. <om:str> и использовать <xs:choice> в определении схемы, уступая что-то вроде этого:

<xs:element name="value"> 
    <xs:complexType> 
     <xs:choice> 
     <xs:element name="model"/> 
     <xs:element name="str" type="xs:string" /> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 

Других возможностей: со схемой 1.1, вы можете добавить <xs:assert> состояния в <xs:complexType>..

Только одно маленькое замечание: чтобы избежать repetion из xmlns:odm="http://www.r-style.com/2014/odm-model" везде, просто установить объявление пространства имен на <xs:schema> корневой декларации:

<xs:schema xmlns:odm="http://www.r-style.com/2014/odm-model" 
+0

Спасибо! Я продолжу работу со схемой. Кроме того, я обязательно попробую совет. – SergeZ

Смежные вопросы