Jag tycker du ser ut att ligga rätt, så som du har gjort.
* = 0 till många
+ = 1 till många
? = 0 till 1 (alltså valbart)
5 svar · 491 visningar · startad av erka
Eftersom jag normalt sett pillar med xmlscheman om något ska göras i xml och inte i DTD:er tänkte jag kolla om jag har hajjat DTD:er korret, har nämligen fått reda på att jag kommer få en DTD-fråga på min tenta i veckan och har inga planera på att kugga den.
Följande gäller, ska ska skapa ett xml-dokument och en dtd efter följande förhållande och exempeldata.

min xml-fil (med exempeldatat)
<?xml version="1.0" encoding"ISO-8859-1"?>
<PERSONS>
<PERSON id="11">
<NAME>Kurt</NAME>
<ADRESS>
<NUMBER>231</NUMBER>
<STREET>Kustvägen</STREET>
</ADRESS>
<ADRESS>
<NUMBER>10</NUMBER>
<STREET>Smyggatan</STREET>
</ADRESS>
</PERSON>
<PERSON id="12">
<NAME>Olof</NAME>
<ADRESS>
<NUMBER>234</NUMBER>
<STREET>Jaktgatan</STREET>
</ADRESS>
</PERSON>
</PERSONS>
och min DTD
<!DOCTYPE PERSONS [
<!ELEMENT PERSONS(PERSON*)>
<!ELEMENT PERSON(NAME,ADRESS*)>
<!ATTLIST PERSON Id ID #REQUIRED>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT ADRESS(NUMBER,STREET)>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT STREET (#PCDATA)>
]>
Det jag är osäker på är *, vad jag ska säga är ju att PERSONS kan innehålla många PERSON och varje PERSON kan innehålla flera ADRESS
Tacksam för all hjälp
Jag tycker du ser ut att ligga rätt, så som du har gjort.
* = 0 till många
+ = 1 till många
? = 0 till 1 (alltså valbart)
Ok, det verkar ju lovande :) Ska vi se om mina schemakunskaper finns kvar, är detta en korrekt översättning på ett schema för det ovan
<xsd:schema>
<!-- Simple elements -->
<xsd:element name="NUMBER" type="xsd:string" />
<xsd:element name="STREET" type="xsd:string" />
<xsd:element name="NAME" type="xsd:string"/>
<!-- Attributes -->
<xsd:attribute name="Id" type="xsd:string" use="required"/>
<!--complex elements -->
<xsd:element name="ADRESS">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="STREET"/>
<xsd:element ref="NUMBER"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="PERSON">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="NAME"/>
<xsd:element ref="ADRESS" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute ref="Id" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Jag ser en avvikelse. I din DTD anger du ADRESS med *, vilket betyder "noll till många". Men i schemat har du utelämnat minOccurs="0". Default för minOccurs är "1". Alltså har du förvandlat "0 till många" till "1 till många".
Sedan ser jag inte vart PERSONS, som ska innehålla PERSON, tog vägen.
UlfT, visste inte att man var tvungen att ha med root-taggen i ett schema, måste missuppfattat något isåfall, hade inte heller någon aning om att minOccurs svar 1 default, ser detta mer korrekt ut då
<xsd:schema>
<!-- Simple elements -->
<xsd:element name="NUMBER" type="xsd:string" />
<xsd:element name="STREET" type="xsd:string" />
<xsd:element name="NAME" type="xsd:string"/>
<!-- Attributes -->
<xsd:attribute name="Id" type="xsd:string" use="required"/>
<!--complex elements -->
<xsd:element name="ADRESS">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="STREET"/>
<xsd:element ref="NUMBER"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="PERSON">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="NAME"/>
<xsd:element ref="ADRESS" maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute ref="Id" use="required"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="PERSONS">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="PERSON" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
tack!
erka skrev:
UlfT, visste inte att man var tvungen att ha med root-taggen i ett schema
Nu gör du mig osäker. Jag har alltid tagit för givet att rot-taggen måste vara med i ett schema. Jag har aldrig tidigare kollat upp den saken. Nu kollade jag lite snabbt i en bok jag har. De exempel på xml-scheman de har, innehåller rot-taggen. Men jag hittade inget om ifall det är ett krav eller ej.