XSD: jak namixovat xs:all do xs:sequence

Martinigue

XSD: jak namixovat xs:all do xs:sequence
« kdy: 06. 01. 2012, 17:38:35 »
Zdravím vše,

mám XML schema s řekněme šesti oblastmi, jejichž pořadí mám určeno uzavřením do xs:sequence. ALE - mezi třetí a čtvrtou oblastí chci mít sadu dvaceti elementů, na jejichž pořadí mi nezáleží, ale z nichž každý bych rád viděl maximálně jednou. xs:all - nelz epoužít protože už jsem uvnitř xs:sequence; xs:sequence nemůžu vnořit do xs:sequence. Bude mít někdo nějaký tip?


Vena

Re:XSD: jak namixovat xs:all do xs:sequence
« Odpověď #1 kdy: 07. 01. 2012, 13:10:54 »
To podle me nejde. Ale nejsem si jisty, jestli vas spravne chapu, nemohl by jste tady napsat nejaky priklad, ceho presne chcete dosahnout ?

Martinigue

Re:XSD: jak namixovat xs:all do xs:sequence
« Odpověď #2 kdy: 07. 01. 2012, 22:36:50 »
Ok, ozřejmím tu ideu na příkladu dopisu:

<xsd:element name="dopis">
<xsd:sequence>
<xsd:element name="hlavicka">
.
.
</xsd:element>
<xsd:element name="radek" attr1=""/>
<xsd:element name="radek" attr1=""/>
<xsd:element name="radek" attr1=""/>
<xsd:element name="zaver">
</xsd:element>
<xsd:sequence>
</xsd:element>

Pro attr1 je definována množina hodnot ( enumerace), a já chci definovat možnost zapsat libovolný počet řádků, přičemž attr1 je povinný a kžadá z definovaných hodnot může být použita max. jednou, nebo vůbec... Je to srozumitelnější?


To podle me nejde. Ale nejsem si jisty, jestli vas spravne chapu, nemohl by jste tady napsat nejaky priklad, ceho presne chcete dosahnout ?

nikdo

Re:XSD: jak namixovat xs:all do xs:sequence
« Odpověď #3 kdy: 08. 01. 2012, 00:29:42 »
Pokud jsem to dobře pochopil na příkladu dopisu, řešil bych to následovně:
  • Elementu radek bych nastavil minOccurs="0" a maxOccurs="N", kde N je počet různých hodnot attr1.
  • pomocí xs:unique v elementu dopis bych zajistil, že se nebudou vyskytovat řádky se stejnou hodnotou attr1.

Výsledné schéma elementu dopis mi pak vychází nějak takto (pro případ, že je hodnot 5):
Kód: [Vybrat]
<xs:element name="dopis">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="hlavicka"/>
      <xs:element name="radek" minOccurs="0" maxOccurs="5">
        <xs:complexType>
          <xs:attribute name="attr1">             
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="hodnota1"/>
                <xs:enumeration value="hodnota2"/>
                <xs:enumeration value="hodnota3"/>
                <xs:enumeration value="hodnota4"/>
                <xs:enumeration value="hodnota5"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:complexType>         
      </xs:element>
      <xs:element name="zaver"/>
    </xs:sequence>
  </xs:complexType>
  <xs:unique name="radek-attr1-musi-byt-unikatni">
    <xs:selector xpath="radek"/>
    <xs:field xpath="@attr1"/>
  </xs:unique>
</xs:element>

Netestoval jsem to, tak je možné, že je v tom chyba, ale princip to, myslím, objasňuje. (Tedy za předpokladu, že jsem dobře pochopil zadání :-)

Martinigue

Re:XSD: jak namixovat xs:all do xs:sequence
« Odpověď #4 kdy: 08. 01. 2012, 00:58:15 »
Prima, no to by asi šlo! ;D Díky moc!

V zásadě mi jde o to, umístit x-krát stejný element ( řádek), ale pokaždé s jinou hodnotou atributu; jenže pokud pravidla chápu správně - jelikož to m uzavřené v sekvenci ( xs:sequence), vypadalo by to jako že mi záleží na pořadí těch různých řádků ( což mi nezáleží) ...

Pokud jsem to dobře pochopil na příkladu dopisu, řešil bych to následovně:
  • Elementu radek bych nastavil minOccurs="0" a maxOccurs="N", kde N je počet různých hodnot attr1.
  • pomocí xs:unique v elementu dopis bych zajistil, že se nebudou vyskytovat řádky se stejnou hodnotou attr1.

Výsledné schéma elementu dopis mi pak vychází nějak takto (pro případ, že je hodnot 5):
Kód: [Vybrat]
<xs:element name="dopis">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="hlavicka"/>
      <xs:element name="radek" minOccurs="0" maxOccurs="5">
        <xs:complexType>
          <xs:attribute name="attr1">             
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="hodnota1"/>
                <xs:enumeration value="hodnota2"/>
                <xs:enumeration value="hodnota3"/>
                <xs:enumeration value="hodnota4"/>
                <xs:enumeration value="hodnota5"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:complexType>         
      </xs:element>
      <xs:element name="zaver"/>
    </xs:sequence>
  </xs:complexType>
  <xs:unique name="radek-attr1-musi-byt-unikatni">
    <xs:selector xpath="radek"/>
    <xs:field xpath="@attr1"/>
  </xs:unique>
</xs:element>

Netestoval jsem to, tak je možné, že je v tom chyba, ale princip to, myslím, objasňuje. (Tedy za předpokladu, že jsem dobře pochopil zadání :-)