SORU
18 ŞUBAT 2010, PERŞEMBE


Herhangi bir sırayla öğeleri sınırsız sayıda izin vermek için nasıl ANNOTATİON -?

Bir ANNOTATİON oluşturmak için çalışıyorum, ve aşağıdaki şartı ile tanımını yazmaya çalışıyorum:

  • Alt öğe, herhangi bir kaç kez görünmesini belirtilen (0 sınırsız) izin verir
  • Alt öğeleri herhangi bir sırayla izin verir

Etrafıma baktım ve this gibi çeşitli çözümler buldu

  <xs:element name="foo">
  <xsl:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="child1" type="xs:int"/>
      <xs:element name="child2" type="xs:string"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

Ama x'ler anladığım kadarıyla:seçim yine tek eleman seçimi sağlar. Dolayısıyla MaxOccurs böyle sınırlandırılmamış ayarı sadece "herhangi bir çocuk element" birden çok kez görünür. anlamına gelir Bu doğru mu?

Eğer yukarıdaki çözüm yanlışsa, nasıl benim gereksinimi yukarıdaki ifade ne elde edebilirsiniz?

EDİT: Eğer şartı aşağıdaki gibi?

  • Eleman alt2 child1 herhangi görünebilir sayısı (0-sınırsız)
  • Satış elemanları
  • Elemanları child3 ve child4 bir kez tam olarak görünmelidir.

Örneğin, bu xml geçerlidir:

<foo>
<child1> value </child1>
<child1> value </child1>
<child3> value </child3>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>

ama bu (child3 kayıp) değildir

<foo>
<child1> value </child1>
<child1> value </child1>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>

CEVAP
17 AĞUSTOS 2012, Cuma


Alternatif formülasyon sorusunu ekledi bir sonraki düzenleme gibi devam cevaplanmamış: nasıl belirttiğiniz çocuklar arasında bir unsuru olmalı adlı child3 adlı child4 ve herhangi bir sayı adında child1 child2 ile hiçbir kısıtlama sırada olan çocuklar görünür.

Bu delikanlı tanımlanabilen düzenli bir dil, ve içerik modeli ihtiyacınız olduğunu izomorfik için bir düzenli ifade tanımlayarak set dizelerinde hangi basamak '3' ve '4' Her ortaya tam bir kez ve rakamı '1' ve '2' ortaya herhangi bir sayı kere. Eğer bu yaz için nasıl belli değil, inşa olur, ne tür bir dil tanımak düşünmeye yardımcı olabilir. En az dört ayrı devletler olurdu:

  • bir ilk durumu her iki taraf için de '3' ne de '4' görülmüştür
  • bir ara devlet içinde '3' görülmüştür ama '4'
  • bir ara devlet olan '4' görülmüştür ama '3'
  • son bir devlet içinde hem '3' ve '4' görülmüştür

Bu otomat içinde durumu ne olursa olsun, '1' ve '2' okuma; makine durumunu değiştirmeyin. İlk devlet, '3' veya '4' de kabul edilen; orta devletler, sadece '4' veya '3' kabul edilmiş; son olarak da, devlet de '3' ne de '4' olduğunu kabul etti. Düzenli ifade yapısı kolay biz önce dilimizi alt için bir düzenli ifade sadece tanımlarsanız anlamak için '3' ve '4' oluşur:

(34)|(43)

'1' veya '2', belirli bir yerde herhangi bir kaç kez ortaya koyabiliriz. (1|2)* (ya da eğer düzenli dilimizi bu sistemi kabul ederse [12]*). izin Mevcut tüm yerlerde bu ifade ekleme

(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*

İçerik bir model haline çevirmek kolaydır. Temel yapısı 20* *normal ifade eşdeğerdir:

<xsd:complexType name="paul0">
  <xsd:choice>
    <xsd:sequence>
      <xsd:element ref="child3"/>
      <xsd:element ref="child4"/>
    </xsd:sequence>
    <xsd:sequence>
      <xsd:element ref="child4"/>
      <xsd:element ref="child3"/>
    </xsd:sequence>
  </xsd:choice>
</xsd:complexType>

child1 child2 sıfır ya da daha fazla seçenek ekleme basittir:

<xsd:complexType name="paul1">
  <xsd:sequence>
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="child1"/>
      <xsd:element ref="child2"/>
    </xsd:choice>      
    <xsd:choice>
      <xsd:sequence>
        <xsd:element ref="child3"/>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="child1"/>
          <xsd:element ref="child2"/>
        </xsd:choice>      
        <xsd:element ref="child4"/>
      </xsd:sequence>
      <xsd:sequence>
        <xsd:element ref="child4"/>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="child1"/>
          <xsd:element ref="child2"/>
        </xsd:choice>      
        <xsd:element ref="child3"/>
      </xsd:sequence>
    </xsd:choice>
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="child1"/>
      <xsd:element ref="child2"/>
    </xsd:choice>      
  </xsd:sequence>
</xsd:complexType>

Eğer toplu bir bit en aza indirmek istiyorsak, child1 child2 yinelenen seçimler için adlı bir grup tanımlayabiliriz:

<xsd:group name="onetwo">
  <xsd:choice>
    <xsd:element ref="child1"/>
    <xsd:element ref="child2"/>
  </xsd:choice>   
</xsd:group>

<xsd:complexType name="paul2">
  <xsd:sequence>
    <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:choice>
      <xsd:sequence>
        <xsd:element ref="child3"/>
        <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="child4"/>
      </xsd:sequence>
      <xsd:sequence>
        <xsd:element ref="child4"/>
        <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="child3"/>
      </xsd:sequence>
    </xsd:choice>  
    <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>

1.1, kısıtlamalardan bazıları all-gruplar Olası bu içerik modeli tanımlamak için kaldırılmıştır, daha özlü: ANNOTATİON

<xsd:complexType name="paul3">
  <xsd:all>
    <xsd:element ref="child1" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element ref="child2" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element ref="child3"/>
    <xsd:element ref="child4"/>      
  </xsd:all>
</xsd:complexType>

Ama görülen örnekler verilmiş daha önce, bu değişiklikler için allgruplar değil aslında değişiklik ifade gücü dili; onlar sadece yapmak tanımı, bazı tür dil daha kısa ve öz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chriselle Lim

    Chriselle Li

    26 Ocak 2008
  • Friday Night Cranks

    Friday Night

    27 Mayıs 2007
  • The Pet Collective

    The Pet Coll

    5 Ocak 2012