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>