XML Schema

0

Mam mały kłopot i mało czasu na jego rozwiązanie. Mimo poszukiwań w tutorialach nie udało mi się skonstruować pewnej mechaniki działania. Lista problemów i fragmenty kodu XML Schema poniżej:


<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">


	<xsd:element name="Diagram">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="ProceduresDefinitions"/>
				<xsd:element name="MAIN" type="xsd:Container"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>


	<xsd:element name="ProcedureName" type="xsd:string"/>


	<xsd:element name="ProceduresDefinitions">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="ProcedureDefinition" type="xsd:ProcedureDefinition"  minOccurs="0" maxOccurs="unbounded"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>


	<xsd:complexType name="ProcedureDefinition">
		<xsd:sequence>
			<xsd:element ref="ProccedureName"/>
			<xsd:element name="Arguments">
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="Argument"   type="xsd:string" minOccurs="0" maxOccurs="25">
							<xsd:complexType>
								<xsd:attribute name="type"   type="xsd:variableType"/>
								<xsd:attribute name="name"   type="xsd:string"/>
							</xsd:complexType>
						</xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
			<xsd:element ref="Definition"/>
		</xsd:sequence>
	</xsd:complexType>


	<xsd:complexType name="Container">
		<xsd:choice>
			<xsd:element name="PROCEDURE"   type="xsd:PROCEDURE" minOccurs="0" maxOccurs="unbounded"/>
			<!-- W rzeczywistości jest więcej elementów (stąd choice), ale niezwiązane są z tym tematem -->
		</xsd:choice>
	</xsd:complexType>


	<xsd:complexType name="PROCEDURE">
		<xsd:sequence>
			<xsd:element name="Name"   type="xsd:string"/>
			<xsd:element name="Arguments">
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="Argument" minOccurs="0" maxOccurs="25">
							<xsd:complexType>
								<xsd:attribute name="name"   type="xsd:string"/>
							</xsd:complexType>
						</xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:complexType>


</xsd:schema>

Jest element główny Diagram. Wewnątrz znajduje się nieistotny na razie MAIN i istotny ProceduresDefinition. W tym typie złożonym może znaleźć się nieokreślona liczba elementów stanowiących definicję konkretnej procedury. Każda procedura definiuje element Arguments, który zawiera nieokreśloną liczbę argumentów. Chciałbym jednak, żeby każdy element "ProcedureDefinition" zawierający się w "ProceduresDefinitions" był unikatowy względem klucza składającego się z elementu "ProccedureName" i elementu "type" wszystkich elementów "Argument" znajdujących się w "ProcedureDefinition". Pisząc prościej - procedura ma nazwę i kilka argumentów, z których każdy ma swój typ - i biorąc nazwę procedury i typ każdego argumentu (z naciskiem na ich kolejność) znajdującego się w tej procedurze - procedura ma być unikatowa (tak jak w kodzie źródłowym Javy, czy C++). Poza tym każde wywołanie elementu procedury PROCEDURE - co jest zdefiniowane w typie Container (głównym elementem tego typu jest element MAIN wewnątrz elementu Diagram) - może mieć nazwę (czyli element "Name" w typie PROCEDURE) taką jak któraś z zadeklarowanych procedur - czyli nie inną niż istniejący już "ProcedureName" w którymś ze stworzonych elementów "ProcedureDefinition" zawartych w elemencie nadrzędnym "ProceduresDefinitions". Próbowałem tak:

w obrębie ProceduresDefinitions chcę stworzyć unikatową krotkę związaną z nazwy i typów .. nie wiem jak się dobrać do wszystkich typów względem jednej nazwy ... zagnieździć unique ?? stworzyć odrębny unique, który potem wykorzystam jako drugi field w procedure_unique ? ale czytałem, że fieldy mogą się odwoływać tylko do typów prostych

<xsd:unique name="procedure_unique">
	<selector xpath="DiagramNS/ProceduresDefinitions"/>
	<field xpath="ProcedureName"/>
	<field xpath="ProcedureName/Arguments/type"/>
</xsd:unique>

tutaj chcę stworzyć klucz, który jest samą nazwą (już bez argumentów), który wykorzystam przy tworzeniu referencji używanej przy wywołaniach procedury, żeby wywołanie miało automatycznie odnośnik do nazw zdefiniowanych procedur

<xsd:key name="procName_key">
	<xsd:selector xpath="DiagramNS/ProceduresDefinitions"/>
	<xsd:field xpath="ProcedureName"/>
</xsd:key>

tu usiłuję stworzyć wspomnianą wyżej referencję, chociaż nie wiem jak ją później wykorzystywać .. sądziłem, że po jej nazwie, ale gdzieś był niejasny przykład wspominający, że ta nazwa nie jest istotna w takim przypadku

<xsd:keyref name="procName_key_ref" refer="procName_key">
	<xsd:selector xpath="DiagramNS/ProceduresDefinitions"/>
	<xsd:field xpath="ProcedureName"/>
</xsd:keyref>

Póki co jednak w XML Spy nie przechodzi przez unique twierdząc, że nie ma takiego słowa dla przestrzeni nazw xsd. Jeśli ktoś się orientuje w temacie to proszę o kod rozwiązujący problem, bo wiele tego kodu zapewne nie będzie. Odnośniki do tutoriali niewiele pomogły, bo nigdzie nie widziałem wyrazistego przykładu, który pomógł by w tej kwestii komuś, kto nigdy nie używał podstaw XML Schema (nie wspominając już o XPathach i reszcie dodatków).

0

Dobra, to inna prośba. Definiuję jakiś element w XML Schema. Ten element ma atrybut id. I chciałbym, żeby wartość tego atrybutu była konkretna (można to uzyskać dzięki fixed lub tworząc własny typ prosty ograniczający zakres innego). Ale ta konkretna wartość ma być liczbą elementów wewnątrz tego elementu z atrybutem id. Nie wiadomo jednak z góry ile tych elementów będzie, id jest zatem zmienne. XPath umożliwia wykorzystanie takiej metody jak count(), czy last(), ale jak jej użyć w tym przypadku ? A jeśli nie powinienem robić tego w taki sposób, to jak ? Funkcje XPatha wykorzystywane są w XQuery lub XSLT, więc martwi mnie to, że tutaj się tego tak nie będzie dało rozwiązać. Nie mam pomysłu jak z tego wybrnąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1