2016-12-22 2 views
2

У меня есть неупорядоченный список элементов, содержащий xs: любые, несколько комбинаций выбора и последовательности были опробованы, все они нарушают «Уникальное атрибутирование частиц». Мой XML выглядит следующим образом:XSD: неупорядоченный список элементов, содержащий xs: any

<mall id="Andaal"> 
    <eff>effRecorder</eff> 
    <morr>id</morr> 
    <todd>toddCurrentType == toddIdOldType</todd> 
    <mall id="donAllId"> 
     <morr>id</morr> 
     <eff>effRecorder</eff> 
     <other>QuickCode</other> 
     <mall id="mall2Id"> 
      <eff>TickerChainEff</eff> 
      <morr>SourceId</morr> 
      <other>TickerCode</other> 
     </mall> 
    </mall> 
    <mall id="mall2SourceId"> 
     <eff>Listing2SourceEff</eff> 
     <morr>id</morr> 
     <other>other2Price</other> 
     <other>ExpiryDate</other> 
    </mall> 
</mall> 

код XSD:

<xs:element name="mall" maxOccurs="unbounded" minOccurs="0"> 
    <xs:complexType mixed="true"> 
     <xs:sequence> 
      <xs:element type="xs:string" name="eff" minOccurs="0"/> 
      <xs:element type="xs:string" name="todd" minOccurs="0"/> 
      <xs:element type="xs:string" name="morr" minOccurs="1"/> 
      <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" /> 
     </xs:sequence> 
     <xs:attribute name="id" use="required"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="[A-Za-z_]+"/> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
</xs:element> 

Обратите внимание, что элементы eff, todd и morr может происходить в любом порядке, и они могут происходить глубже в иерархии внутри другого mall элемент.

ответ

3

XSD 1,0

Использование XSD 1.0 это не представляется возможным. В основном парсер должен иметь возможность подбирать каждый элемент и задавать его текущее состояние (недвусмысленно), какой элемент схемы он должен использовать для его проверки. Он не поддерживает какую-либо форму поиска. Представляя любой, вы предоставляете двусмысленность, любой из них будет соответствовать существующим элементам eff, todd, morr, это может быть разрешено путем поиска вперед, но это не поддерживается.

Так что лучшее, что вы получите это

enter image description here

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)--> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="mall"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element name="eff" type="xs:string" minOccurs="0" /> 
       <xs:element name="todd" type="xs:string" minOccurs="0" /> 
       <xs:element name="morr" type="xs:string" minOccurs="0" /> 
       <xs:any minOccurs="0" namespace="##other" processContents="lax" /> 
      </xs:choice> 
      <xs:attribute name="id" use="required"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="[A-Za-z_]+" /> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Где любой ограничен в любое пространство имен, которое не является текущим TargetNamespace. Это предотвращает двусмысленность и все в порядке.

Кроме того, теперь у вас есть схема, которая позволяет использовать элементы 0-n eff, todd, morr. Так что это далеко не идеально.

XSD 1,1

Вы можете делать то, что вы пытаетесь сделать с помощью XSD 1.1 с помощью элемента OpenContent.

enter image description here

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)--> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="mall"> 
     <xs:complexType mixed="true"> 
      <xs:openContent mode="interleave"> 
       <xs:any processContents="lax" /> 
      </xs:openContent> 
      <xs:all> 
       <xs:element name="eff" type="xs:string" minOccurs="0" /> 
       <xs:element name="todd" type="xs:string" minOccurs="0" /> 
       <xs:element name="morr" type="xs:string" minOccurs="1" /> 
      </xs:all> 
      <xs:attribute name="id" use="required"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="[A-Za-z_]+" /> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Это обеспечивает соблюдение правил мощностные, размещенные на эф, Todd & Morr, позволяя вам поместить любое другое содержимое между ними, т.е.

<?xml version="1.0" encoding="utf-8"?> 
<!-- Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com) --> 
<mall xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="Schema11.xsd" id="_Mi___XW"> 
    <OTHER></OTHER> 
    <eff>string</eff> 
    <OTHER></OTHER> 
    <todd>string</todd> 
    <OTHER></OTHER> 
    <morr>string</morr> 
    <OTHER></OTHER> 
</mall> 

Недостатком является XSD 1,1 не В дополнение к этому, Xerces и несколько других парсеров поддерживают его, но не так много.

UPDATE

Обновлено чтобы отразить комментарии Майкла Кея. Как указывает Майкл, XSD 1.1 теперь может устранить двусмысленность между любыми и названными элементами. Результат проще.

enter image description here

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)--> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="mall"> 
     <xs:complexType mixed="true"> 
      <xs:all> 
       <xs:element name="eff" type="xs:string" minOccurs="0" /> 
       <xs:element name="todd" type="xs:string" minOccurs="0" /> 
       <xs:element name="morr" type="xs:string" minOccurs="1" /> 
       <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" /> 
      </xs:all> 
      <xs:attribute name="id" use="required"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="[A-Za-z_]+" /> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
+3

На самом деле вам не нужно OpenContent в XSD 1.1: схема в порядке, как это, потому что неоднозначность между конкретным элементом частицей и подстановочными частицами решаются в пользу конкретного элемента , –

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