Archiv für Dezember, 2011

Der einfachste REST-Webservice mit XQuery und exist-db (Erste Schritte mit XRX – 2 von X)

In einem früheren Beitrag hatte ich mich schon begeistert über die einfachen und eleganten REST-Services, die mit XRX möglich sind, geäußert. Hier nun der Beweis, der einfachste REST-Webservice wo gibt:

declare namespace request="http://exist-db.org/xquery/request";
 
<result>
	{concat('Hallo ', request:get-parameter('name', 'Welt'), '!')}
</result>

Dieser Code kann einfach in einer XQuery-Datei innerhalb von exist-db gespeichert werden, in einer betterFORM-Installation etwa unterhalb des Hauptordners betterform, so dass sie sofort im betterFORM-Dashboard erscheint. Der Service kann dann z.B. mit http://localhost:8080/betterform/rest/db/betterform/service.xquery?name=Max aufgerufen werden, zurückgegeben wird das allseits beliebte »Hallo Max!«. Zugegeben: Das Beispiel macht nicht viel, aber an der Stelle des XPath-Ausdrucks kann natürlich jeder beliebig mächtige andere Ausdruck stehen.

Für die Parameterverarbeitung wird eine proprietäre Erweiterung von exist-db benutzt; in der Praxis empfiehlt sich deshalb, diese Funktion gegen eine selbst definierte in einer ausgelagerten Modul-Bibliothek zu ersetzen, um bei einem Plattformwechsel schnell die notwendigen Anpassungen vornehmen zu können.

Keine Kommentare

XML Schema: complexType mit simpleContent

Gelegentlich steht man vor dem Problem, in XML Schema ein Element mit einem oder mehreren Attributen und einem in irgendeiner Form beschränkten simpleContent (Text, Zahlen, URIs; aber keine Elemente) zu definieren. Die Syntax von XML Schema dazu ist wenig intuitiv:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
	<xs:element name="MyElement">
		<xs:complexType>
			<xs:simpleContent>
				<xs:extension base="MySimpleElementType">
					<xs:attribute name="MyAttribute" type="MySimpleAttributeType"/>
				</xs:extension>
			</xs:simpleContent>
		</xs:complexType>
	</xs:element>
 
	<xs:simpleType name="MySimpleElementType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Value_A"/>
			<xs:enumeration value="Value_B"/>
		</xs:restriction>
	</xs:simpleType>
 
	<xs:simpleType name="MySimpleAttributeType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="AttributeContent_A"/>
			<xs:enumeration value="AttributeContent_B"/>
		</xs:restriction>
	</xs:simpleType>
 
</xs:schema>

Es handelt sich um einen complexType (wegen des Attributes) mit simpleContent (hier xs:string mit aufgezählten gültigen Werten). Wenig intuitiv ist, dass ein simpleType mit einem Attribut erweitert wird und so faktisch ein complexContent wird, aber trotzdem innerhalb von simpleContent steht. Der Schlüssel ist sicher die Unterscheidung von Type und Content, denn der Inhalt des Elements ist ja immer noch einfach.

Das Schema und ein Instanzdokument habe ich in der Beispielsammlung abgelegt.

Keine Kommentare