XML XSD-Elemente als zusammengesetzter Schlüssel
-
Hi,
ich habe ein XSD Dokument welches einen komplexen Typen: "PLUGIN_PRIMAR_KEY" beinhaltet.
Ich würde diesen Typen gerne als Schlüssel verwenden und seine Einzigartigkeit über xds verifizieren. Ist das mit einem xs:key möglich oder muss ich dann aus den
Elementen Attribute machen ??<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://db-tenen-pup.selfhost.me/TPS" targetNamespace="http://db-tenen-pup.selfhost.me/TPS" elementFormDefault="qualified"> <xs:element name="TPS_PLUGIN_CONFIGURATION_DESCRIPTION"> <xs:complexType> <xs:sequence> <xs:element name="PLUGIN_DESCRIPTION" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="PLUGIN_PRIMAR_KEY"> <xs:complexType> <xs:sequence> <xs:element name="IID_INTERFACE_ID"> <xs:complexType> <xs:sequence> <xs:element name="DATA1"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="4"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="DATA2"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="2"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="DATA3"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="2"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="DATA4"> <xs:complexType> <xs:sequence> <xs:element name="BYTE0"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="BYTE1"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="BYTE2"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="BYTE3"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="BYTE4"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="BYTE5"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="BYTE6"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="BYTE7"> <xs:simpleType> <xs:restriction base="xs:hexBinary"> <xs:length value="1"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="UI64_VERSION"> <xs:simpleType> <xs:restriction base="xs:hexBinary" > <xs:length value="8"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> <xs:attribute name="Selector" use="required" type="xs:string"/> </xs:complexType> </xs:element> <xs:element name="UI32_PRIORITY"> <xs:simpleType> <xs:restriction base="xs:hexBinary" > <xs:length value="4"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="ARR_PLUGINS_TO_LOAD_DLL_NAME"> <xs:simpleType> <xs:restriction base="xs:string" > <xs:minLength value="5"/> <xs:maxLength value="80"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> <xs:attribute name="Name" use="required"> <xs:simpleType> <xs:restriction base="xs:string" > <xs:minLength value="5"/> <xs:maxLength value="80"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="PluginDescriptionID" use="required" type="xs:string"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:key name="aKey"> <xs:selector xpath=".//*" /> <xs:field xpath="PLUGIN_DESCRIPTION/PLUGIN_PRIMAR_KEY/IID_INTERFACE_ID/DATA1" /> </xs:key> </xs:element> </xs:schema>
Ein Beispiel XML welches auf Grund gleicher Schlüssel beim validieren einen Fehler erzeigen sollte:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <TPS_PLUGIN_CONFIGURATION_DESCRIPTION xmlns="http://db-tenen-pup.selfhost.me/TPS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://db-tenen-pup.selfhost.me/TPS http://db-tenen-pup.selfhost.me/TPS/GlobalPluginConfig.xsd"> <PLUGIN_DESCRIPTION Name="PluginName" PluginDescriptionID="0"> <PLUGIN_PRIMAR_KEY Selector="0"> <IID_INTERFACE_ID> <DATA1>29e4223c</DATA1> <DATA2>2d64</DATA2> <DATA3>45b4</DATA3> <DATA4> <BYTE0>94</BYTE0> <BYTE1>d9</BYTE1> <BYTE2>bd</BYTE2> <BYTE3>fa</BYTE3> <BYTE4>fd</BYTE4> <BYTE5>e3</BYTE5> <BYTE6>b1</BYTE6> <BYTE7>07</BYTE7> </DATA4> </IID_INTERFACE_ID> <UI64_VERSION>0000000000000000</UI64_VERSION> </PLUGIN_PRIMAR_KEY> <UI32_PRIORITY>00000003</UI32_PRIORITY> <ARR_PLUGINS_TO_LOAD_DLL_NAME>../Plugin_00/Plugin_00/Plugin_00.dll</ARR_PLUGINS_TO_LOAD_DLL_NAME> </PLUGIN_DESCRIPTION> <PLUGIN_DESCRIPTION Name="PluginName" PluginDescriptionID="1"> <PLUGIN_PRIMAR_KEY Selector="0"> <IID_INTERFACE_ID> <DATA1>29e4223c</DATA1> <DATA2>2d64</DATA2> <DATA3>45b4</DATA3> <DATA4> <BYTE0>94</BYTE0> <BYTE1>d9</BYTE1> <BYTE2>bd</BYTE2> <BYTE3>fa</BYTE3> <BYTE4>fd</BYTE4> <BYTE5>e3</BYTE5> <BYTE6>b1</BYTE6> <BYTE7>07</BYTE7> </DATA4> </IID_INTERFACE_ID> <UI64_VERSION>0000000000000000</UI64_VERSION> </PLUGIN_PRIMAR_KEY> <UI32_PRIORITY>00000003</UI32_PRIORITY> <ARR_PLUGINS_TO_LOAD_DLL_NAME>../Plugin_00/Plugin_00/Plugin_00.dll</ARR_PLUGINS_TO_LOAD_DLL_NAME> </PLUGIN_DESCRIPTION> </TPS_PLUGIN_CONFIGURATION_DESCRIPTION>
-
Packe mal deinen XSD-Code in passende XML Code-Tags (inklusive Einrückung).
-
Habs versucht, wie schaut denn das Tag aus ??
Der [XML] </> button funktioniert bei mir leider nicht.
-
So:
<xs:element name="PLUGIN_PRIMAR_KEY"> </xs>
(deinen Code markieren, XML in der ComboBox wählen und dann daneben auf den "</>"-Button drücken - oder meinen Beitrag zitieren und dir den Code anschauen und kopieren).
-
Okay, ich habe das Problem wie Folgt gelöst.
Ist wahrscheinlich noch nicht die letzte Version, aber sie funktioniert mal.<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tps="http://db-tenen-pup.selfhost.me/TPS" targetNamespace="http://db-tenen-pup.selfhost.me/TPS" elementFormDefault="qualified"> <!--=====================================================================--> <!--====================Tensor Engines Plugin System=====================--> <!--============================Versionsdaten============================--> <!--=====================================================================--> <xs:include schemaLocation="GlobalPluginConfigAdminData.xsd"/> <!--=====================================================================--> <!--====================Tensor Engines Plugin System=====================--> <!--===============Konfigurationsdaten fuer ein Plugin===================--> <!--====Kann n-mal in TPS_PLUGIN_CONFIGURATION_DESCRIPTION auftreten=====--> <!--=====================================================================--> <xs:element name="PLUGIN_CONFIGURATION"> <xs:complexType> <xs:sequence> <!--...............Klartext modul bschreibung fuer Anwender..............--> <xs:element name="PLUGIN_DESCRIPTION" type="tps:Plugin_Description_String_t"/> <!--.........Prioritaet mit welcher das Modul ausgefuehert wird..........--> <xs:element name="UI32_PRIORITY" type="tps:HexBin4_t"/> <!--.............Name der Dll welche geladen werden soll.................--> <xs:element name="ARR_PLUGINS_TO_LOAD_DLL_NAME" type="tps:Dll_Name_String_t"/> <!--.......Plugin abhaengigkeiten welche geladen werden mussen...........--> <xs:element name="PLUGIN_DEPENDENCIES" type="tps:Plugin_Dependencies_t" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> <xs:attribute name="IID_Data1" type="tps:HexBin4_t"/> <xs:attribute name="IID_Data2" type="tps:HexBin2_t"/> <xs:attribute name="IID_Data3" type="tps:HexBin2_t"/> <xs:attribute name="IID_Data4_0" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_1" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_2" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_3" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_4" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_5" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_6" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_7" type="tps:HexBin1_t"/> <xs:attribute name="ui64_Version" type="tps:HexBin8_t"/> </xs:complexType> <!--.....................................................................--> <!--................Schluessel fuer PLUGIN_CONFIGURATION ................--> <!--..........Sicherstellen dass die Abhaengigkeitsbeziehungen...........--> <!--........zwischen PLUGIN_CONFIGURATION und PLUGIN_DEPENDENCIES........--> <!--.........................eindeutig sind..............................--> <!--.....................................................................--> <xs:unique name="PluginDescriptionKeyReferenceUnique"> <xs:selector xpath="tps:PLUGIN_DEPENDENCIES/tps:DEP_ITEM"/> <xs:field xpath="@IID_Data1" /> <xs:field xpath="@IID_Data2" /> <xs:field xpath="@IID_Data3" /> <xs:field xpath="@IID_Data4_0" /> <xs:field xpath="@IID_Data4_1" /> <xs:field xpath="@IID_Data4_2" /> <xs:field xpath="@IID_Data4_3" /> <xs:field xpath="@IID_Data4_4" /> <xs:field xpath="@IID_Data4_5" /> <xs:field xpath="@IID_Data4_6" /> <xs:field xpath="@IID_Data4_7" /> <xs:field xpath="@ui64_Version" /> </xs:unique> </xs:element> <!--=====================================================================--> <!--====================Tensor Engines Plugin System=====================--> <!--==================Konfigurationsdaten Root Element===================--> <!--==========Kann 1-mal in einem XML-Instanzdokument auftreten==========--> <!--=====================================================================--> <xs:element name="TPS_PLUGIN_CONFIGURATION_DESCRIPTION"> <xs:complexType> <xs:sequence> <xs:element name="TPS_ADMIN_DATA" type="tps:TPS_AdminData_t" minOccurs="1" maxOccurs="1" /> <xs:element ref="tps:PLUGIN_CONFIGURATION" minOccurs="1" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> <!--.....................................................................--> <!--................Schluessel fuer PLUGIN_CONFIGURATION ................--> <!--..................IID:Interface ID des Plugins.......................--> <!--............Version:Version des Plugins mit der IID..................--> <!--.................PluginDescriptionKey:{IID,Version}..................--> <!--.......................IID:{Data[1,3],Data4}.........................--> <!--...........................Data4:{[0,7]}.............................--> <!--.....................................................................--> <xs:key name="PluginDescriptionKey"> <xs:selector xpath="tps:PLUGIN_CONFIGURATION" /> <xs:field xpath="@IID_Data1" /> <xs:field xpath="@IID_Data2" /> <xs:field xpath="@IID_Data3" /> <xs:field xpath="@IID_Data4_0" /> <xs:field xpath="@IID_Data4_1" /> <xs:field xpath="@IID_Data4_2" /> <xs:field xpath="@IID_Data4_3" /> <xs:field xpath="@IID_Data4_4" /> <xs:field xpath="@IID_Data4_5" /> <xs:field xpath="@IID_Data4_6" /> <xs:field xpath="@IID_Data4_7" /> <xs:field xpath="@ui64_Version" /> </xs:key> <!--.....................................................................--> <!--................Schluessel fuer PLUGIN_CONFIGURATION ................--> <!--..........Sicherstellen dass die Abhaengigkeitsbeziehungen...........--> <!--........zwischen PLUGIN_CONFIGURATION und PLUGIN_DEPENDENCIES........--> <!--...........................existieren................................--> <!--.....................................................................--> <xs:keyref name="PluginDescriptionKeyReference" refer="tps:PluginDescriptionKey"> <xs:selector xpath="tps:PLUGIN_CONFIGURATION/tps:PLUGIN_DEPENDENCIES/tps:DEP_ITEM"/> <xs:field xpath="@IID_Data1" /> <xs:field xpath="@IID_Data2" /> <xs:field xpath="@IID_Data3" /> <xs:field xpath="@IID_Data4_0" /> <xs:field xpath="@IID_Data4_1" /> <xs:field xpath="@IID_Data4_2" /> <xs:field xpath="@IID_Data4_3" /> <xs:field xpath="@IID_Data4_4" /> <xs:field xpath="@IID_Data4_5" /> <xs:field xpath="@IID_Data4_6" /> <xs:field xpath="@IID_Data4_7" /> <xs:field xpath="@ui64_Version" /> </xs:keyref> </xs:element> <!--=====================================================================--> <!--=========================Typen Deklarationen=========================--> <!--=====================================================================--> <xs:complexType name="Plugin_Dependencies_t"> <xs:sequence> <xs:element name="DEP_ITEM" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:attribute name="IID_Data1" type="tps:HexBin4_t"/> <xs:attribute name="IID_Data2" type="tps:HexBin2_t"/> <xs:attribute name="IID_Data3" type="tps:HexBin2_t"/> <xs:attribute name="IID_Data4_0" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_1" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_2" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_3" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_4" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_5" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_6" type="tps:HexBin1_t"/> <xs:attribute name="IID_Data4_7" type="tps:HexBin1_t"/> <xs:attribute name="ui64_Version" type="tps:HexBin8_t"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:simpleType name="HexBin8_t"> <xs:restriction base="xs:string"> <xs:pattern value="[0]{1}[x]{1}[0-9a-fA-F]{16}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="HexBin4_t"> <xs:restriction base="xs:string"> <xs:pattern value="[0]{1}[x]{1}[0-9a-fA-F]{8}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="HexBin2_t"> <xs:restriction base="xs:string"> <xs:pattern value="[0]{1}[x]{1}[0-9a-fA-F]{4}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="HexBin1_t"> <xs:restriction base="xs:string"> <xs:pattern value="[0]{1}[x]{1}[0-9a-fA-F]{2}"/> </xs:restriction> </xs:simpleType> <!--TODO: This is not the full set, and it is possible to declare a wrong path--> <xs:simpleType name="Dll_Name_String_t"> <xs:restriction base="xs:string"> <xs:pattern value="([.][.][/]|[0-9a-zA-Z]|[/]|[\-]|[_]|[=]|[.]|[%]|[(]|[)]|[!]|[$]|[#])*[.][d][l][l]"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="Plugin_Description_String_t"> <xs:restriction base="xs:string" > <xs:minLength value="50"/> <xs:maxLength value="200"/> </xs:restriction> </xs:simpleType> </xs:schema>