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ší?


Citace od: Vena 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 ?

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):
<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ží) ...

Citace od: nikdo 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):
<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í :-)