Hallo zusammen!
Ich habe folgendes XML:
<dataobject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SimpleObject.xsd" xmlns="http://www.ekkaia.at/xml/namespaces/dataobject/v1.0">
<metadata>
<objects>
<object name="test1">
<columns>
<column name="text" type="text" size="255"/>
<column name="number" type="integer"/>
</columns>
</object>
<object name="test2">
<columns>
<column name="texts" type="text" size="255"/>
<ref object="test1"/>
</columns>
</object>
</objects>
</metadata>
<data name="test1">
<row id="1">
<value name="texts">Hello World!</value>
<value name="number" null="true"/>
</row>
</data>
</dataobject>
und habe versucht mittels xs:key zu erzwingen das innerhalb eines object tags jedes Attribut name nur einmal vorkommen darf und das in data/row/value/@name nur namen stehen dürfen die in object existieren.
Beispiel:
in data[test1]/row/value dürfen nur attributwerte "name" vorkommen die in metadata/objects/object[test1]/columns/column/@name existieren.
Ich habe leider nach vielen versuchen keine lösung gefunden. mein bisheriger Ansatz:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:do="http://www.ekkaia.at/xml/namespaces/dataobject/v1.0" targetNamespace="http://www.ekkaia.at/xml/namespaces/dataobject/v1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="dataobject">
<xs:complexType>
<xs:sequence>
<xs:element ref="do:metadata" minOccurs="1" maxOccurs="1"/>
<xs:element ref="do:data" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="namekey">
<xs:selector xpath="do:metadata/dobjects/dobject/do:columns"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="namekeyref" refer="do:namekey">
<xs:selector xpath="do:data/do:row/do:value"/>
<xs:field xpath="@name"/>
</xs:keyref>
</xs:element>
<xs:element name="metadata">
<xs:complexType>
<xs:sequence>
<xs:element ref="dobjects" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="objects">
<xs:complexType>
<xs:sequence>
<xs:element ref="dobject" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="object">
<xs:complexType>
<xs:sequence>
<xs:element ref="do:columns" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="columns">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:choice>
<xs:element ref="do:column" minOccurs="1" maxOccurs="unbounded"/>
<xs:element ref="do:ref" minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:unique name="uqcolumnname">
<xs:selector xpath="column"/>
<xs:field xpath="@name"/>
</xs:unique>
</xs:element>
<xs:element name="ref">
<xs:complexType>
<xs:attribute name="object" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="column">
<xs:complexType>
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="integer"/>
<xs:enumeration value="text"/>
<xs:enumeration value="float"/>
<xs:enumeration value="datetime"/>
<xs:enumeration value="xml"/>
<xs:enumeration value="blob"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="size" use="optional">
<xs:simpleType>
<xs:restriction base="xs:int">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="8000"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="nullable" use="optional" default="false" type="xs:boolean"/>
<xs:attribute name="autoincrement" use="optional" default="false" type="xs:boolean"/>
<xs:attribute name="options" use="optional" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element ref="do:row" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="row">
<xs:complexType>
<xs:sequence>
<xs:element ref="do:value" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" use="required" type="xs:int"/>
</xs:complexType>
<xs:unique name="uqvaluename">
<xs:selector xpath="value"/>
<xs:field xpath="@name"/>
</xs:unique>
</xs:element>
<xs:element name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="null" use="optional" type="xs:boolean" default="false"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
Kann mir bitte jemand helfen?
lg
Ich habe folgendes XML:
<dataobject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SimpleObject.xsd" xmlns="http://www.ekkaia.at/xml/namespaces/dataobject/v1.0">
<metadata>
<objects>
<object name="test1">
<columns>
<column name="text" type="text" size="255"/>
<column name="number" type="integer"/>
</columns>
</object>
<object name="test2">
<columns>
<column name="texts" type="text" size="255"/>
<ref object="test1"/>
</columns>
</object>
</objects>
</metadata>
<data name="test1">
<row id="1">
<value name="texts">Hello World!</value>
<value name="number" null="true"/>
</row>
</data>
</dataobject>
und habe versucht mittels xs:key zu erzwingen das innerhalb eines object tags jedes Attribut name nur einmal vorkommen darf und das in data/row/value/@name nur namen stehen dürfen die in object existieren.
Beispiel:
in data[test1]/row/value dürfen nur attributwerte "name" vorkommen die in metadata/objects/object[test1]/columns/column/@name existieren.
Ich habe leider nach vielen versuchen keine lösung gefunden. mein bisheriger Ansatz:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:do="http://www.ekkaia.at/xml/namespaces/dataobject/v1.0" targetNamespace="http://www.ekkaia.at/xml/namespaces/dataobject/v1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="dataobject">
<xs:complexType>
<xs:sequence>
<xs:element ref="do:metadata" minOccurs="1" maxOccurs="1"/>
<xs:element ref="do:data" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="namekey">
<xs:selector xpath="do:metadata/dobjects/dobject/do:columns"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="namekeyref" refer="do:namekey">
<xs:selector xpath="do:data/do:row/do:value"/>
<xs:field xpath="@name"/>
</xs:keyref>
</xs:element>
<xs:element name="metadata">
<xs:complexType>
<xs:sequence>
<xs:element ref="dobjects" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="objects">
<xs:complexType>
<xs:sequence>
<xs:element ref="dobject" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="object">
<xs:complexType>
<xs:sequence>
<xs:element ref="do:columns" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="columns">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:choice>
<xs:element ref="do:column" minOccurs="1" maxOccurs="unbounded"/>
<xs:element ref="do:ref" minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:unique name="uqcolumnname">
<xs:selector xpath="column"/>
<xs:field xpath="@name"/>
</xs:unique>
</xs:element>
<xs:element name="ref">
<xs:complexType>
<xs:attribute name="object" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="column">
<xs:complexType>
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="integer"/>
<xs:enumeration value="text"/>
<xs:enumeration value="float"/>
<xs:enumeration value="datetime"/>
<xs:enumeration value="xml"/>
<xs:enumeration value="blob"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="size" use="optional">
<xs:simpleType>
<xs:restriction base="xs:int">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="8000"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="nullable" use="optional" default="false" type="xs:boolean"/>
<xs:attribute name="autoincrement" use="optional" default="false" type="xs:boolean"/>
<xs:attribute name="options" use="optional" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element ref="do:row" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="row">
<xs:complexType>
<xs:sequence>
<xs:element ref="do:value" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" use="required" type="xs:int"/>
</xs:complexType>
<xs:unique name="uqvaluename">
<xs:selector xpath="value"/>
<xs:field xpath="@name"/>
</xs:unique>
</xs:element>
<xs:element name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="null" use="optional" type="xs:boolean" default="false"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
Kann mir bitte jemand helfen?
lg
Comment