[XML] Choice

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 07-07 16:30

Akerboom

Codito, ergo sum

Topicstarter
In mijn xsd die ik aan het opstellen ben in het programma XMLSPY wil ik een soort afhankelijkheid maken.

Nu heb een element van type boolean en een element van type string.
Deze string mag 0 keer voorkomen en maximaal 1 keer voorkomen.

Maar het liefst zou ik hebben dat deze alleen voor mag komen als de boolean true is. Is dit mogelijk, zo ja hoe is dan de constructie (in XMLSPY)?

Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Lastige zaak. Eigenlijk zou je dit willen doen:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="bar">
    <xsd:complexType>
      <xsd:choice>
        <xsd:sequence>
          <xsd:element name="foo" type="false"/>
        </xsd:sequence>
        <xsd:sequence>
          <xsd:element name="foo" type="true"/>
          <xsd:element name="fred" type="xsd:string"/>
        </xsd:sequence>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:simpleType name="true">
    <xsd:restriction base="xsd:boolean">
      <xsd:enumeration value="true"/>
      <xsd:enumeration value="1"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="false">
    <xsd:restriction base="xsd:boolean">
      <xsd:enumeration value="false"/>
      <xsd:enumeration value="0"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>


Dit is alleen niet toegestaan om dat dit niet deterministisch is. Prut dus. In RELAX NG kan je dit uiteraard wel gewoon opschrijven.

Dit mag dan weer wel:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="bar">
    <xsd:complexType>
      <xsd:choice>
        <xsd:sequence>
          <xsd:element name="false"/>
        </xsd:sequence>
        <xsd:sequence>
          <xsd:element name="true"/>
          <xsd:element name="fred" type="xsd:string"/>
        </xsd:sequence>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Ook kan je aan aan simpleContent nog attributen verbinden, maar ik denk dat dat je probleem niet oplost.

Er zijn dus drie oplossingen:
• Je taal aanpassen aan de beperkingen van de schema taal
• Een betere schema taal gebruiken (RELAX NG)
• Deze constraint niet vastleggen in een schema

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 07-07 16:30

Akerboom

Codito, ergo sum

Topicstarter
ik kies de laatste wel: "Deze constraint niet vastleggen in een schema" :)

In de XSL file handel ik het netjes af... als mensen dan de string specificeren terwijl de boolean false is dan is die niet zichtbaar... maar de XML is niet fout...

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Als ik jou was zou ik overstappen op RELAX NG. Het is niet alleen krachtiger, maar ook gemakkelijker. Kortom: beter.

Rustacean


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Je kan zulke constraints trouwens ook wel mooi uitdrukken in Schematron. Schematron is een wat alternatieve schema taal voor xml die niet de volledige structuur van een taal beschrijft, maar een aantal voorwaarden controleert. Er zijn voor de meeste platformen wel implementaties, dus niets houd je tegen om verder te gaan dan alleen een W3C XML Schema (wat overigens ook voor RELAX NG geldt ;) ).

Op xml.com is net een artikeltje over Schematron verschenen. Leuk om even door te lezen:
http://xml.com/pub/a/2003/11/12/schematron.html

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment