2012-03-21 9 views
5

ja zobaczyłem taką próbkę:Ref atrybut lub atrybut Wpisz XSD

<xsd:element name="Product"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="ProductName" type="xsd:string" /> 
      <xsd:element name="Customer" type="xsd:CustomerType" /> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 
<xsd:element name="CustomerType"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="FullName" type="xsd:string" /> 
      <xsd:element name="Age" type="xsd:string" /> 
      <xsd:element name="Age" type="xsd:occupation" /> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

I zastanawiam się dlaczego ktoś wybrał jedną type zamiast ref w takim przypadku:

<xsd:element name="Product"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="ProductName" type="xsd:string" /> 
      <xsd:element ref="Customer" /> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 
<xsd:element name="Customer"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="FullName" type="xsd:string" /> 
      <xsd:element name="Age" type="xsd:string" /> 
      <xsd:element name="Age" type="xsd:occupation" /> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

Co byłaby pozytywna strona korzystania z Type zamiast ref, czy ktoś może mi wyjaśnić? To, co wiem, to ref może również mieć opcję minOccurs i maxOccurs, dzięki czemu można zdefiniować ref jako tablice w postaci zserializowanej.

Odpowiedz

5

Istnieje wiele sposobów na to spojrzeć. Myślę, że wszystko zaczęło się od kilku podstawowych zasad, takich jak spójność w stylu tworzenia. Stamtąd ludzie zaczęli analizować implikacje działania w jedną stronę przeciw drugiej; podano imiona: rosyjska lalka, plaster salami, żaluzje weneckie, ogród Eden. Jeśli chcesz dowiedzieć się więcej, wyszukiwanie stylów tworzenia XSD, zwane również wzorami projektowymi dla XSD, przyniesie mnóstwo stron zajmujących się tym tematem. Te link i this one to całkiem niezłe "podobne do fast foodów" odniesienia, od których zacznę ... Chociaż nie zgadzam się z niektórymi stwierdzeniami tam, np. contains only one global element (więc, jeśli zdefiniuję schemat rq/rs dla usługi sieciowej, nie będę zgodny) ogólnie jest dobrym starterem.

W twoim przypadku konsekwentne definiowanie modeli zawartości na podstawie elementów referencyjnych jest oznaką wzorca "plasterka salami": wszystkie elementy globalne, typy lokalne (anonimowe). Pierwszą konsekwencją jest to, że nie można pozbyć się przestrzeni nazw powiązanych ze znacznikiem.

Nie używając elementów odniesienia, ale zamiast tego polegając na lokalnych definicjach, z typami globalnymi, wskazuje wzór "wenecki w ciemno". Zgodnie z powyższym komentarzem przestrzeni nazw, dzięki temu podejściu można teraz kontrolować przestrzenie nazw, ustawiając atrybut elementFormDefault na elemencie schematu.

MinOccurs/maxOccurs, które są powiązane z cząsteczkami, nie mają tu zastosowania. W przypadku elementu globalnego atrybuty te nie mają zastosowania. W przypadku cząsteczek modelu zawartości, elementów będących jednym rodzajem, niezależnie od tego, czy element jest 01 lub 30, czy nie, nie ma znaczenia.

+0

Twój pierwszy link wydaje się być uszkodzony. – BrianTheLion

+0

@BrianTheLion, zaktualizowałem pierwszy link. –