<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>XML, XSLT &#38; Java</title>
	<atom:link href="http://blog.expedimentum.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.expedimentum.com</link>
	<description>Texte und Metadaten verarbeiten. Fundstücke und Beispiele</description>
	<lastBuildDate>Fri, 09 Dec 2011 21:51:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Der einfachste REST-Webservice mit XQuery und exist-db (Erste Schritte mit XRX – 2 von X)</title>
		<link>http://blog.expedimentum.com/2011/rest-webservice-mit-xquery-exist-db/</link>
		<comments>http://blog.expedimentum.com/2011/rest-webservice-mit-xquery-exist-db/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 21:51:49 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[exist-db]]></category>
		<category><![CDATA[XQuery]]></category>
		<category><![CDATA[XRX]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=541</guid>
		<description><![CDATA[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=&#34;http://exist-db.org/xquery/request&#34;; &#160; &#60;result&#62; {concat('Hallo ', request:get-parameter('name', 'Welt'), '!')} &#60;/result&#62; Dieser Code kann einfach in einer XQuery-Datei innerhalb von exist-db gespeichert werden, in einer [...]]]></description>
			<content:encoded><![CDATA[<p>In einem <a href="http://blog.expedimentum.com/2011/erste-schritte-mit-xrx-1/" title="Erste Schritte mit XRX (1 von X)">früheren Beitrag</a> hatte ich mich schon begeistert über die einfachen und eleganten REST-Services, die mit <a href="http://blog.expedimentum.com/?page_id=505" >XRX</a> möglich sind, geäußert. Hier nun der Beweis, der einfachste REST-Webservice wo gibt:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">declare namespace request=&quot;http://exist-db.org/xquery/request&quot;;
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;result<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	{concat('Hallo ', request:get-parameter('name', 'Welt'), '!')}
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/result<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Dieser Code kann einfach in einer <a href="http://blog.expedimentum.com/glossar/xquery/" >XQuery</a>-Datei innerhalb von exist-db gespeichert werden, in einer betterFORM-Installation etwa unterhalb des Hauptordners <code>betterform</code>, so dass sie sofort im betterFORM-Dashboard erscheint. Der Service kann dann z.B. mit <code>http://localhost:8080/betterform/rest/db/betterform/service.xquery?name=Max</code> aufgerufen werden, zurückgegeben wird das allseits beliebte »Hallo Max!«. Zugegeben: Das Beispiel macht nicht viel, aber an der Stelle des <a href="http://blog.expedimentum.com/glossar/xpath/" >XPath</a>-Ausdrucks kann natürlich jeder beliebig mächtige andere Ausdruck stehen.</p>
<p>Für die Parameterverarbeitung wird eine <a href="http://exist.sourceforge.net/xquery.html#d2001e934" title="exist-db: xquery">proprietäre Erweiterung von exist-db</a> 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.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2011/rest-webservice-mit-xquery-exist-db/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML Schema: complexType mit simpleContent</title>
		<link>http://blog.expedimentum.com/2011/xml-schema-complextype-mit-simplecontent/</link>
		<comments>http://blog.expedimentum.com/2011/xml-schema-complextype-mit-simplecontent/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 12:51:20 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[XML Schema]]></category>
		<category><![CDATA[XML-Validierung]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=537</guid>
		<description><![CDATA[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: &#60;xs:schema xmlns:xs=&#34;http://www.w3.org/2001/XMLSchema&#34;&#62; &#160; &#60;xs:element name=&#34;MyElement&#34;&#62; &#60;xs:complexType&#62; &#60;xs:simpleContent&#62; &#60;xs:extension base=&#34;MySimpleElementType&#34;&#62; &#60;xs:attribute name=&#34;MyAttribute&#34; type=&#34;MySimpleAttributeType&#34;/&#62; &#60;/xs:extension&#62; &#60;/xs:simpleContent&#62; &#60;/xs:complexType&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Gelegentlich steht man vor dem Problem, in <a href="http://blog.expedimentum.com/glossar/xml-schema/" >XML Schema</a> ein Element mit einem oder mehreren Attributen und einem in irgendeiner Form beschränkten <code>simpleContent</code> (Text, Zahlen, URIs; aber keine Elemente) zu definieren. Die Syntax von XML Schema dazu ist wenig intuitiv:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:schema</span> <span style="color: #000066;">xmlns:xs</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:element</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;MyElement&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:complexType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:simpleContent<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:extension</span> <span style="color: #000066;">base</span>=<span style="color: #ff0000;">&quot;MySimpleElementType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:attribute</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;MyAttribute&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;MySimpleAttributeType&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xs:extension<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xs:simpleContent<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xs:complexType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xs:element<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:simpleType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;MySimpleElementType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:restriction</span> <span style="color: #000066;">base</span>=<span style="color: #ff0000;">&quot;xs:string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:enumeration</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Value_A&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:enumeration</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Value_B&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xs:restriction<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xs:simpleType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:simpleType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;MySimpleAttributeType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:restriction</span> <span style="color: #000066;">base</span>=<span style="color: #ff0000;">&quot;xs:string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:enumeration</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;AttributeContent_A&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xs:enumeration</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;AttributeContent_B&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xs:restriction<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xs:simpleType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xs:schema<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Es handelt sich um einen <code>complexType</code> (wegen des Attributes) mit <code>simpleContent</code> (hier <code>xs:string</code> mit aufgezählten gültigen Werten). Wenig intuitiv ist, dass ein <code>simpleType</code> mit einem Attribut erweitert wird und so faktisch ein <code>complexContent</code> wird, aber trotzdem innerhalb von <code>simpleContent</code> steht. Der Schlüssel ist sicher die Unterscheidung von Type und Content, denn der Inhalt des Elements ist ja immer noch einfach.</p>
<p>Das <a href="http://www.expedimentum.org/example/xsd/complexType_with_simpleContent.xsd" title="XML Schema">Schema</a> und ein <a href="http://www.expedimentum.org/example/xsd/complexType_with_simpleContent.xml" title="XML Instanz">Instanzdokument</a> habe ich in der Beispielsammlung abgelegt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2011/xml-schema-complextype-mit-simplecontent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erste Schritte mit XRX (1 von X)</title>
		<link>http://blog.expedimentum.com/2011/erste-schritte-mit-xrx-1/</link>
		<comments>http://blog.expedimentum.com/2011/erste-schritte-mit-xrx-1/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 00:22:14 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[exist-db]]></category>
		<category><![CDATA[XForms]]></category>
		<category><![CDATA[XQuery]]></category>
		<category><![CDATA[XRX]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=514</guid>
		<description><![CDATA[XRX ist eine Technik für die Entwicklung und den Betrieb von Webanwendungen. Das Akronym steht nach einem sehr allgemeinen Verständnis für XML für die Datenspeicherung im Client, REST-Schnittstellen und XML auf dem Server. Im engeren Sinne wird XRX meist für XForms, REST, XQuery verwendet, wobei XQuery in der Regel auf eine XML-Datenbank zugreift. Als XML-affiner [...]]]></description>
			<content:encoded><![CDATA[<p><strong>XRX</strong> ist eine Technik für die Entwicklung und den Betrieb von Webanwendungen. Das Akronym steht nach einem sehr allgemeinen Verständnis für <em>XML</em> für die Datenspeicherung im Client, <em>REST</em>-Schnittstellen und <em>XML</em> auf dem Server. Im engeren Sinne wird <a href="http://blog.expedimentum.com/?page_id=505" >XRX</a> meist für <em><a href="http://blog.expedimentum.com/?page_id=500" >XForms</a></em>, <em>REST</em>, <em><a href="http://blog.expedimentum.com/glossar/xquery/" >XQuery</a></em> verwendet, wobei XQuery in der Regel auf eine XML-Datenbank zugreift.</p>
<p>Als XML-affiner Zeitgenosse war ich natürlich neugierig auf diese Technik. Meine Erfahrungen bei den ersten Schritten möchte ich hier notieren – schließlich ist aller Anfang schwer, aber nicht notwendigerweise für alle.</p>
<h3>Ein erstes Resümee vorab</h3>
<p>XRX ist recht komplex, und die Entwicklung wird (nach meinem jetzigen Kenntnisstand) nicht mit dem gewohnten Komfort unterstützt. Zuverlässige, d.h. kontext-sensitive Content Completition habe ich bisher noch nicht gefunden, und beim Debugging fühle ich mich schlecht unterstützt: mir fehlen Informationen zu den internen Abläufen (und Fehlern) des XForms-Prozessors. Und gleich noch eine Warnung: ohne einigermaßen belastbare Kenntnisse von <a href="http://blog.expedimentum.com/glossar/xpath/" >XPath</a>, Namespaces und ein bisschen Erfahrung mit <a href="http://blog.expedimentum.com/glossar/xml-schema/" >XML Schema</a>, XQuery und/oder <a href="http://blog.expedimentum.com/glossar/xslt/" >XSLT</a> wird der Einstieg eher schwer.</p>
<p>Auf der anderen Seite wird man von XRX mit eleganter, effizienter und plattformunabhängiger Anwendungsentwicklung belohnt (obwohl ich nicht über genug Erfahrung mit anderen Plattformen verfüge, um solche Einschätzungen zu treffen, wage ich mal dieses Statement). Ein REST-Webservice in drei Zeilen XQuery löst bei mir ebenso Begeisterung aus wie die »magische« (d.h. codefreie) Aktualisierung von Formularfeldern durch XForms oder der unmittelbare Zugriff auf die soeben altualisierten XML-Daten via REST. Da bin ich doch recht zuversichtlich, XRX demnächst auch produktiv einsetzen zu können.</p>
<h3>Installation</h3>
<p>Es gibt verschiedene vorkonfigurierte Bundles aus XForms-Prozessor und XML-Datenbank; ich habe mich aus Bequemlichkeit (die Entwickler arbeiten in Berlin, und ich kenne sie persönlich) für die <a href="http://www.betterform.de/en/xml-suite.html" title="Produktseite von betterFORM">betterFORM XML Suite</a> mit eXist-db als XML-Datenbank entschieden. Für Windows gibt es eine Installer-Exe, für den Mac ein JAR. Unter Windows bemäkelte der Installer das 7er SDK, aber nach einem Neustart lief die Installation einfach durch. betterFORM hat auf seiner Seite eine <a href="http://betterform.wordpress.com/2011/02/24/getting-started-with-betterform-limegreen/" title="Getting started with betterFORM limeGreen">detaillierte Anleitung</a>.</p>
<p>Nach der Installation kann man sich im betterFORM Dashboard einen ersten Eindruck von XForms-Anwendungen verschaffen.</p>
<p><strong>Tipp: </strong>Der »eXist Admin Client« (erreichbar über Download und Start von <code>exist.jnlp</code> rechts oben im betterFORM Dashboard) erlaubt einen ersten Einblick in die Datenbank. Besonders zum Anlegen und Löschen von Collections und Dateien leistet er gute Dienste.</p>
<h3>OxygenXML</h3>
<p>Zum Entwickeln braucht es natürlich eine IDE. <a href="http://blog.expedimentum.com/oxygen/" >OxygenXML</a> bietet eine gute Integration von eXist-db, die Einrichtung ist in der F1-Hilfe und auf der <a href="http://www.oxygenxml.com/eXist_support.html" title="eXist-db bei OxygenXML">OxygenXML-Seite zu eXist-db</a> detailliert beschrieben. Ich habe dann ewig gebraucht, um die URL der REST-Schnittstelle zu finden und bin später über die Lösung gestolpert: beim Start des »eXist Admin Client« ist die korrekte URL voreingestellt und kann einfach nach OxygenXML kopiert werden. Mit den Standardparametern ist die URL <code>xmldb:exist://localhost:8080/betterform/xmlrpc</code>.</p>
<p><a href="http://blog.expedimentum.com/wp-content/uploads/eXist-db_Admin_Client_Login.png"><img src="http://blog.expedimentum.com/wp-content/uploads/eXist-db_Admin_Client_Login-300x197.png" alt="Login-Dialog des »eXist-db Admin Client« mit URL zur RPC-Schnittstelle zur Datenbank" title="»eXist-db Admin Client«, Login" width="300" height="197" class="alignleft size-medium wp-image-517" /></a></p>
<p><a href="http://blog.expedimentum.com/wp-content/uploads/OxygenXML_eXist-db_connector.png"><img src="http://blog.expedimentum.com/wp-content/uploads/OxygenXML_eXist-db_connector-300x201.png" alt="Konfiguration des OxygenXML-Konnektors zu eXist-db" title="OxygenXML, eXist-db connector" width="300" height="201" class="alignright size-medium wp-image-518" /></a></p>
<p><br style="clear:left;"/></p>
<p><strong>Tipp: </strong>Die Arbeit mit Dateien und an der Datenbank geht mit OxygenXML sehr leicht von der Hand. Man kann Dateien öffnen, bearbeiten und zurück in die Datenbank speichern, außerdem sind Dateioperationen wie Löschen, Umbenennen oder Importieren möglich. Unbedingt ausprobieren!</p>
<p><a href="http://blog.expedimentum.com/wp-content/uploads/OxygenXML_Auswahl_Dokumententyp_XForms.png"><img src="http://blog.expedimentum.com/wp-content/uploads/OxygenXML_Auswahl_Dokumententyp_XForms-180x300.png" alt="Auswahl des passenden Dokumententyps bei neuen Dateien" title="OxygenXML, Datei/Neu" width="180" height="300" class="alignright size-medium wp-image-524" /></a>Zweite Hürde ist die Unterstützung durch Content Completition und Validierung. Während XQuery direkt unterstützt wird, ist für XForms etwas Handarbeit notwendig. Der einfachste Weg ist, die Processing Instruction <code>&lt;?xml-model href="http://www.oxygenxml.com/1999/xhtml/xhtml-xforms.nvdl" schematypens="http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0"?&gt;</code> am Anfang eines XHTML-Dokumentes einzufügen. Außerdem können neue Dokumente über Datei/Neu mit dem Dokumenentyp (unter Framework templates/XHTML) »XHTML 1.0 RNG Based + XForms 1.1« angelegt werden. Die XForms-Unterstützung ist nicht perfekt, aber sehr praktisch.</p>
<h3>»Hello World« und Tutorials</h3>
<p>Das <a href="http://en.wikibooks.org/wiki/XForms/HelloWorld" title="Hello World im Wikibook »XForms«">Hello-World-Beispiel</a> aus dem XForms-Wikibook lief bei mir auf Anhieb. Die nächsten Schritte – Zugriff auf eXist-db, Anzeigen, Erstellen, Löschen, Laden und Speichern von Datensätzen – habe ich mir recht zügig mit dem guten »<a href="http://wiki.orbeon.com/forms/doc/developer-guide/orbeon-forms-xforms-tutorial" title="Orbeon Forms XForms Tutorial">Orbeon Forms XForms Tutorial</a>« erarbeitet. Danach helfen der <a href="http://www.w3.org/TR/xforms/" title="W3C recommendation XForms 1.1">XForms-Standard beim W3C</a>, der »XForms Feature Explorer« (erreichbar über das betterFORM Dashboard) sowie die <a href="http://exist.sourceforge.net/documentation.html" title="eXist-db, Dokumentation">Online-Dokumentation von eXist-db</a> weiter. Schließlich habe ich mir manche Einsicht und Anregung aus »<a href="http://www.danmccreary.com/xrx/beginners-guide/beginners-guide-to-xrx.xhtml" title="A Beginners Guide [to] XRX">A Beginners Guide XRX</a>« von Dan McCreary und Joe Wicentowski geholt.</p>
<p>Im Rückblick war der Einstieg dann gar nicht so schwer. Größte und unerwartete Hürde für mich war das Erforschen und Verstehen des Model-View-Controller-Konzepts von XForms und der darauf aufbauenden Sprachkonstrukte. Und auch ein paar Pattern wollten erarbeitet sein. Dazu vielleicht später mehr.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2011/erste-schritte-mit-xrx-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XSLT-SB: asin(), acos(), atan(), atan2(), dynamische Typung</title>
		<link>http://blog.expedimentum.com/2011/xslt-sb-asin-acos-atan-atan2-dynamische-typung/</link>
		<comments>http://blog.expedimentum.com/2011/xslt-sb-asin-acos-atan-atan2-dynamische-typung/#comments</comments>
		<pubDate>Sun, 26 Jun 2011 23:06:29 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[XSLT-SB]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=475</guid>
		<description><![CDATA[Mit dem Sprung auf Version 0.2.37 kann die XSLT-SB, genauer math.xsl, jetzt auch die Arkusfunktionen und dynamische Typung. In Ergänzung der knappen Release-Notes hier ein paar Anmerkungen dazu. Arkusfunktionen Die Gruppe der Arkusfunktion lässt sich einfach auf der Grundlage von atan() implementieren – wenn man den richtigen Ansatz gefunden hat. Meine ersten Versuche, asin() und [...]]]></description>
			<content:encoded><![CDATA[<p>Mit dem Sprung auf Version 0.2.37 kann die <a href="http://code.google.com/p/xslt-sb/">XSLT-SB</a>, genauer <a href="http://www.expedimentum.org/example/xslt/xslt-sb/math.xsl"><code>math.xsl</code></a>, jetzt auch die Arkusfunktionen und dynamische Typung. In Ergänzung der knappen Release-Notes hier ein paar Anmerkungen dazu.</p>
<h3>Arkusfunktionen</h3>
<p>Die Gruppe der Arkusfunktion lässt sich einfach auf der Grundlage von <code>atan()</code> implementieren – wenn man den richtigen Ansatz gefunden hat. Meine ersten Versuche, <code>asin()</code> und <code>atan()</code> über <a href="http://de.wikipedia.org/wiki/Taylorreihe#Trigonometrische_Funktionen">Taylor-Reihen</a> zu implementierten scheiterten daran, dass diese Reihen zu langsam konvergieren. Zusammen mit den in der Reihenbildung verwendeten rekursiven Funktionen (Fakultät und Potenz) war schnell das Limit der Rekursionstiefe erreicht: <a href="http://blog.expedimentum.com/glossar/saxon/" >Saxon</a> bricht die Verarbeitung mit Hinweis auf das Überschreiten der maximalen Rekursionstiefe ab.</p>
<p>Die Lösung brachte ein alternativer Algorithmus zur Berechnung von <code>atan()</code>, den ich bei <a href="http://mathworld.wolfram.com/InverseTangent.html">WolframMathWorld</a> fand (Gleichungen Nr.&nbsp;44 bis 48). Mittels des Arkustangens lässt sich einfach der Arkussinus und Arkuskosinus berechnen, so dass diese Implementierung ein Kinderspiel war (siehe <a href="http://de.wikipedia.org/wiki/Arkussinus_und_Arkuskosinus#Beziehung_zum_Arkustangens">Wikipedia</a>).</p>
<h3>dynamische Typung</h3>
<p>Zweites großes Thema der Überarbeitung von <code>math.xsl</code> war die dynamische Typung. Die mathematischen Operatoren und Funktionen in <a href="http://blog.expedimentum.com/glossar/xpath/" >XPath</a> geben ihr Ergebnis i.d.R. mit dem Typ der Argumente zurück. Zum Beispiel ist das Ergebnis von <code>fn:round-half-to-even()</code> mit einem Argument vom Typ <code>xs:decimal</code> vom Typ <code>xs:decimal</code>, während mit einem <code>xs:double</code>-Argument das Ergebnis vom Typ <code>xs:double</code> ist.</p>
<p>Die Implementierung dieses Verhaltens barg einige Schwierigkeiten, weil manche Funktionen als Ergebnis <code>NaN</code>, <code>-INF</code> oder <code>INF</code> zurückgeben können. Diese speziellen Werte sind zwar mit den Typen <code>xs:float</code> und <code>xs:double</code> darstellbar, nicht aber mit <code>xs:decimal</code> (das aber genauere Ergebnisse als<code> xs:double</code> liefert) und <code>xs:integer</code>. Das gewünschte Verhalten ist wohl sehr vom Einsatzzweck der Funktionen abhängig. Der jetzige Kompromiss ist daher, dass bei diesen Werten der Cast von <code>NaN</code>, <code>-INF</code> oder <code>INF</code> auf ungeeignete Typen scheitert; wer Wert auf hohe Genauigkeit legt, kann vielleicht auch die kritischen Werte umschiffen.</p>
<h3>Genauigkeit</h3>
<p>Laut <a href="http://www.w3.org/TR/xmlschema-2/#decimal">Standard</a> müssen XPath-Implementierungen mit 18 signifikanten Stellen rechnen. Für die <a href="http://blog.expedimentum.com/glossar/xslt/" >XSLT</a>-SB habe ich mittels <code>intern:round()</code> die Genauigkeit auf 16 Stellen begrenzt, weil damit die meisten Tests erfolgreich absolviert werden. Trotzdem wird für manche Testwerte (etwa <code>exp(100)</code>) nicht das richtige Ergebnis ermittelt (bei vielen Berechnungsschritten summieren sich die Fehler halt). In diesen Fällen wird im Testprotokoll (hier z.B. für <a href="http://www.expedimentum.org/example/xslt/xslt-sb/test-results/saxon-ee/math_tests.html">Saxon&nbsp;EE</a>) eine Warnung (orange hinterlegt) ausgegeben. Diese sind zu unterscheiden von den gelb hinterlegten Fällen, bei denen ein Cast der Ergebnisse auf <code>xs:decimal</code> (den Typ der Tests) nicht möglich ist, siehe oben. In den Tests nicht berücksichtigt sind die Fälle, für die eine Funktion nicht definiert ist, etwa <code>asin(3)</code>.</p>
<p>Intern (d.h. bei den Funktionen mit <code>intern:</code>-Prefix) wird mit einer höhren Stellenzahl gerechnet, diese müssen aber weder signifikant noch richtig sein.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2011/xslt-sb-asin-acos-atan-atan2-dynamische-typung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AltovaXML in OxygenXML einbinden</title>
		<link>http://blog.expedimentum.com/2011/altovaxml-in-oxygenxml-einbinden/</link>
		<comments>http://blog.expedimentum.com/2011/altovaxml-in-oxygenxml-einbinden/#comments</comments>
		<pubDate>Mon, 30 May 2011 05:24:20 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[Grundlagen]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=395</guid>
		<description><![CDATA[Um AltovaXML in OxygenXML nutzen zu können, muss man diesen XSLT-Prozessor als »Custom Engine« einrichten. So geht’s: Unter Einstellungen/XML/XSLT-FO-XQuery/Custom Engines einen neuen Prozessor anlegen: Als Prozessortyp ist »XSLT« vorausgewählt und richtig. Name und Beschreibung eingeben und dann in das Feld Kommandozeile »"C:\Program Files (x86)\Altova\AltovaXML2011\AltovaXML.exe" /xslt2 ${xsl} /in ${xml} /out ${out}« eintragen (Pfad zu AltovaXML bitte [...]]]></description>
			<content:encoded><![CDATA[<p>Um <a href="http://blog.expedimentum.com/glossar/altovaxml/" >AltovaXML</a> in <a href="http://blog.expedimentum.com/oxygen/" >OxygenXML</a> nutzen zu können, muss man diesen <a href="http://blog.expedimentum.com/glossar/xslt-prozessor/" >XSLT-Prozessor</a> als »Custom Engine« einrichten. So geht’s:</p>
<p>Unter <code>Einstellungen/XML/XSLT-FO-XQuery/Custom Engines</code> einen neuen Prozessor anlegen:</p>
<div id="attachment_397" class="wp-caption aligncenter" style="width:500px"><a href="http://blog.expedimentum.com/2011/altovaxml-in-oxygenxml-einbinden/OxygenXML_Altova_01/"><img src="http://blog.expedimentum.com/wp-content/uploads/OxygenXML_Altova_01.png" alt="OxygenXML: einen neuen XSLT-Prozessor anlegen, Seite »Custom Engines«" title="OxygenXML_Altova_01" width="500" class="size-medium wp-image-397" /></a></div>
<p/>
<p>Als Prozessortyp ist »XSLT« vorausgewählt und richtig. Name und Beschreibung eingeben und dann in das Feld Kommandozeile »<code>"C:\Program Files (x86)\Altova\AltovaXML2011\AltovaXML.exe" /xslt2 ${xsl} /in ${xml} /out ${out}</code>« eintragen (Pfad zu AltovaXML bitte an lokale Gegebenheiten anpassen).</p>
<div id="attachment_398" class="wp-caption aligncenter" style="width: 374px"><a href="http://blog.expedimentum.com/2011/altovaxml-in-oxygenxml-einbinden/OxygenXML_Altova_02/"><img src="http://blog.expedimentum.com/wp-content/uploads/OxygenXML_Altova_02.png" alt="OxygenXML: einen neuen XSLT-Prozessor anlegen: Standardeinstellung für AltovaXML" title="OxygenXML_Altova_02" width="364" height="491" class="size-full wp-image-398" /></a><p class="wp-caption-text">OxygenXML: Standardeinstellung für AltovaXML</p></div>
<p>Speichern, fertig. In den Transformationsszenarien kann jetzt der neu angelegte Prozessor ausgewählt werden:</p>
<div id="attachment_397" class="wp-caption aligncenter" style="width:526px"><a href="http://blog.expedimentum.com/2011/altovaxml-in-oxygenxml-einbinden/OxygenXML_Altova_04/"><img src="http://blog.expedimentum.com/wp-content/uploads/OxygenXML_Altova_04.png" alt="OxygenXML: Auswahl der XSLT-Prozessors im Transformationsszenario" title="OxygenXML_Altova_04" width="526" height="414" class="size-full wp-image-400" /></a></div>
<p/>
<p>Leider kann OxygenXML keine Parameter oder initiale Modes bzw. initiale Templates an den so erzeugten Prozessor übergeben. Ein Workaround ist, für definierte Fälle eigene Prozessoren anzulegen. Für den ad-hoc-Selbsttest der XSL-SB sieht das so aus:</p>
<div id="attachment_399" class="wp-caption aligncenter" style="width: 374px"><a href="http://blog.expedimentum.com/2011/altovaxml-in-oxygenxml-einbinden/OxygenXML_Altova_03/"><img src="http://blog.expedimentum.com/wp-content/uploads/OxygenXML_Altova_03.png" alt="OxygenXML: einen neuen XSLT-Prozessor anlegen: AltovaXML mit erweiterten Einstellungen für initialen Mode und Parameter" title="OxygenXML_Altova_03" width="364" height="491" class="size-full wp-image-399" /></a><p class="wp-caption-text">OxygenXML: AltovaXML mit erweiterten Einstellungen für initialen Mode und Parameter</p></div>
<p>Der erste Teil der Kommandozeile »<code>"C:\Program Files (x86)\Altova\AltovaXML2011\AltovaXML.exe" /xslt2 ${xsl} /in ${xml} /out ${out} /m internals.self-test -param internals.logging-level="'DEBUG'" -param internals.errors.die-on-critical-errors="'no'"</code>« ist identisch zu oben, initialer Mode und Parameter werden zusätzlich hart codiert übergeben. Hier sollten die Entwickler von OxygenXML gelegentlich einmal nachbessern, es kann ja nicht so schwer sein, einen benannten Parameter als benanntes Makro anzubieten.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2011/altovaxml-in-oxygenxml-einbinden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XSLT-SB – eine Standard-Bibliothek für XSLT</title>
		<link>http://blog.expedimentum.com/2011/xslt-sb-standard-bibliothek-fuer-xslt/</link>
		<comments>http://blog.expedimentum.com/2011/xslt-sb-standard-bibliothek-fuer-xslt/#comments</comments>
		<pubDate>Sat, 14 May 2011 21:45:40 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[Beispiele]]></category>
		<category><![CDATA[XSLT und XPath]]></category>
		<category><![CDATA[XSLT-SB]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=367</guid>
		<description><![CDATA[Es ist vollbracht. Nach ein paar Wochenenden mit Feinschliff und letzten Test habe ich Version 0.2 von XSLT-SB – einer Standard-Bibliothek für XSLT – veröffentlicht. Was ist XSLT-SB? Die XSLT-Standard-Bibliothek (XSLT-SB) beinhaltet nützliche, immer wieder gebrauchte Funktionen und Templates. Gleichzeitig dient sie als beispielhafte Implementierung bestimmter Techniken. Sie wendet sich als Beispielsammlung vor allem an [...]]]></description>
			<content:encoded><![CDATA[<p>Es ist vollbracht. Nach ein paar Wochenenden mit Feinschliff und letzten Test habe ich Version 0.2 von <a href="http://blog.expedimentum.com/glossar/xslt/" >XSLT</a>-SB – einer Standard-Bibliothek für XSLT – veröffentlicht.</p>
<h3>Was ist XSLT-SB?</h3>
<p>Die XSLT-Standard-Bibliothek (XSLT-SB) beinhaltet nützliche, immer wieder gebrauchte Funktionen und Templates. Gleichzeitig dient sie als beispielhafte Implementierung bestimmter Techniken. Sie wendet sich als Beispielsammlung vor allem an deutschsprachige Entwickler, um für diese die Einstiegshürden zu senken.</p>
<p>Die XSLT-SB hat zwei Quellen: einerseits habe ich zeitig angefangen, immer wieder gebrauchte Funktionen und Templates in produktive Bibliothek-Stylesheets auszulagern. Für die XSLT-SB habe ich einige davon übernommen. Beispiele dafür sind <code>xsb:force-cast-to-integer()</code> und <code>xsb:parse-string-to-boolean()</code> sowie die Grundlagen des Logging-Systems. Andererseits habe ich aus Spaß (oder so) mal die eine oder andere Funktion implementiert, bspw. ist <code><a href="http://www.expedimentum.org/example/xslt/xslt-sb/files.xsl">files.xsl</a></code> wesentlich umfangreicher ausgefallen, als es für die eigentliche Aufgabe notwendig gewesen wäre.</p>
<p>Templates und Funktionen der XSLT-SB entstanden also nicht systematisch, sondern nach Bedarf oder Interesse. Im besonderen habe ich nicht versucht, bestehende Bibliotheken wie <a href="http://blog.expedimentum.com/glossar/exslt/" >EXSLT</a> zu ersetzen. Deshalb kann die XSLT-SB mit Fug und Recht als lückenhaft bezeichnet werden.</p>
<p>Ich habe die XSLT-SB in einigen kleineren Projekten produktiv eingesetzt, aber der dauernde Härtetest steht noch aus. Außerdem sind die Stylesheets durch Dokumentation und Tests recht umfangreich; und ich habe sie auch nicht auf eine hohe Ausführungsgeschwindigkeit optimiert. Deshalb möchte ich heute von einem produktiven Einsatz abraten, aber selbstverständlich können einzelne Templates oder Funktionen gezielt in eigene Projekte übernommen werden. Die Veröffentlichung der Stylesheets macht einen breiteren Einsatz möglich, und ich freue mich auf das Feedback. Abhängig davon mag sie sich in die eine oder andere Richtung entwickeln &#8211; mehr Beispielsammlung oder mehr produktive Bibliothek.</p>
<p>Drei Besonderheiten der XSLT-SB möchte ich hervorheben: <code>files.xsl</code>, das Logging-System und die Testumgebung.</p>
<h3>files.xsl</h3>
<p><code>files.xsl</code> bündelt Funktionen rund um URLs. Da <code>xs:anyURI</code> kaum geprüft wird, habe ich die Regeln von <a href="http://tools.ietf.org/html/rfc1808">RFC 1808</a> (URL) in diverse String-Tests gegossen und darauf aufbauend Funktionen zum Ermitteln von Dateiname, Dateipfad, Dateierweiterung usw. entwickelt. Ergänzt wird das Stylesheet durch Funktionen wie <code>xsb:file-exists()</code> und <code>xsb:mediatype-from-url()</code>.</p>
<p>Das Stylesheet demonstriert einige spezielle XML- und XSLT-Techniken, etwa benannte Entities für lesbare <a href="http://blog.expedimentum.com/glossar/regularer-ausdruck/" >reguläre Ausdrücke</a>, von Systemeigenschaften abhängige Funktionen (mit <code>use-when</code>) und die Verwendung von Java-Funktionen.</p>
<h3>Logging-System</h3>
<p>Die XSLT-SB implementiert ein konfigurierbares Logging-System, um Nachrichten des Stylesheets während der Verarbeitung einfach und flexibel auszugeben. Meldungen können per <code>xsl:message</code> oder (soweit der Rückgabetyp einer Funktion oder eines Templates das zulässt) als Kommentar, XML-Element oder HTML ausgegeben werden, unterschiedliche Dringlichkeitsstufen werden unterstützt. Die XSLT-SB nutzt das Logging-System intensiv für die Selbsttests der Funktionen, für den Einstieg lohnt ein Blick auf <code>xsb:internals.Error</code> bzw. <code>xsb:internals.FunctionError</code> in <a href="http://www.expedimentum.org/example/xslt/xslt-sb/internals.xsl">internals.xsl</a>.</p>
<h3>Testumgebung</h3>
<p>Für Funktionstest habe ich eine Testumgebung entwickelt (siehe <a href="http://www.expedimentum.org/example/xslt/xslt-sb/internals.testing.xsl">internals.testing.xsl</a>). Tests werden in Templates zusammengefasst, die im Stylesheet selbst oder in externen Teststylesheets abgelegt werden können und per initialem Mode oder initialem Template aufgerufen werden. Einige Funktionen und Templates helfen beim Vergleich von erwarteten und berechneten Werten und kümmern sich um die Protokollierung. Interessanterweise haben mir die Test nicht nur beim nachträglichen Absichern der Stylesheets geholfen, sondern ich bin relativ schnell auf eine testgetriebene Entwicklung umgestiegen. Diesen Aspekt möchte ich in meiner täglichen Arbeit nicht mehr missen.</p>
<p>Die Testumgebung wird durch formale Tests der Stylesheets selbst ergänzt (<a href="http://www.expedimentum.org/example/xslt/xslt-sb/internals.stylecheck.xsl">internals.stylecheck.xsl</a>, Template <code>intern:internals.Stylecheck</code>). Sie warnen bei fehlender Typung von Variablen, Parametern und Funktionen, fehlender Dokumentation u.a. und listen ToDos.</p>
<p>Ein Beispiel für absolvierte Tests und den Stylecheck, ausgegeben über das Logging-System als HTML, sind die <a href="http://www.expedimentum.org/example/xslt/xslt-sb/test-results/saxon-he/files_tests.html">Testergebnisse für <code>files.xml</code> unter Saxon-HE</a>.</p>
<h3>Wie kann die XSLT-SB benutzt werden?</h3>
<p>Wie ich oben schrieb, kann ich die XSLT-SB im Moment nicht für den produktiven Einsatz empfehlen. Wer es trotzdem wagen möchte, kann sich die Stylesheets <a href="http://code.google.com/p/xslt-sb/downloads/list">herunterladen</a> und in eigene Projekte einbinden. Ein neues Projekt kann einfach auf der Grundlage von <a href="http://www.expedimentum.org/example/xslt/xslt-sb/pattern+includes.xsl">pattern+includes.xsl</a> begonnen werden. Natürlich kann man die Stylesheets auch zum Nachschauen oder für Kopieren &#038; Einfügen verwenden.</p>
<p>Die Verwendung der meisten Funktionen sollte selbsterklärend sein, für die Logging- und Testumgebung können die XSLT-SB-Stylesheets als Beispiel herangezogen werden. Die Stylesheets sind dokumentiert; eine HTML-Version der Dokumentation liegt im <code>doc</code>-Verzeichnis der Distribution und – meist aktueller – <a href="http://www.expedimentum.org/example/xslt/xslt-sb/doc/">online</a>.</p>
<h3>Lizenz</h3>
<p>Die Stylesheets und das Drumherum sind dual lizenziert: EXPAT (MIT) für den Einsatz als Software und CC-by&#160;3.0, so dass einer Verwendung keine rechtlichen Hürden im Weg stehen sollten.</p>
<h3>Was kommt als nächstes?</h3>
<p>Das hängt vom Feedback ab – oder von überraschenden neuen Projekten. Auszug aus meiner ToDo-List:</p>
<ul>
<li><s>auf Intel SOAE zum laufen bringen, im Moment stürzt dieser Prozessor einfach ab</s> [<strong>Nachtrag:</strong> Ich habe das Problem eingegrenzt und im Intel-Forum dargestellt. In neueren Versionen des Prozessors tritt es wohl nicht mehr auf, allerdings plant Intel keine Veröffentlichung einer neuen Version, siehe <a href="http://software.intel.com/en-us/forums/showthread.php?t=82906&#038;o=a&#038;s=lr">hier</a>. Damit sind mir hier wohl die Hände gebunden …]</li>
<li>Dokumentation verbessern, z.B. Liste der Funktionen mit Kurzbeschreibung erstellen. [<strong>Nachtrag:</strong> Im <a href="http://code.google.com/p/xslt-sb/w/list">Projektwiki</a> gibt es jetzt aus den Stylesheets heraus generierte Übersichten.]</li>
<li>zusätzliche Funktionen implementieren, bspw. habe ich gerade wieder mal das <code>p:directory-list</code> aus <a href="http://blog.expedimentum.com/glossar/xproc/" >XProc</a> vermisst</li>
<li>Kompakt-Distribution ohne geschwätzige Kommentare und Dokumentation erzeugen, um die Startgeschwindigkeit zu erhöhen</ul>
<h3>Links</h3>
<p>Ich habe das Projekt bei Google-Code eingestellt, dort gibt es sowohl ein SVN-Repository als auch fertige Distributionen, die gelegentlich dem aktuellen Entwicklungsstand hinterherhinken können. Auf den Expedimentum-Seiten gibt es ein aktuelles Checkout aus dem Trunk, hier kann man auch online die Dokumentation einsehen. Kommentare und Fehlermeldungen sollten über die Google-Seiten laufen.</p>
<ul>
<li><strong>Download:</strong> <a href="http://code.google.com/p/xslt-sb/downloads/list">http://code.google.com/p/xslt-sb/downloads/list</a></li>
<li><strong>Projektseite bei Google Code:</strong> <a href="http://code.google.com/p/xslt-sb/">http://code.google.com/p/xslt-sb/</a></li>
<li><strong>aktuelles Checkout:</strong> <a href="http://www.expedimentum.org/example/xslt/xslt-sb/">http://www.expedimentum.org/example/xslt/xslt-sb/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2011/xslt-sb-standard-bibliothek-fuer-xslt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Ant: Initialen Mode und Initiales Template für XSLT 2.0 mit Saxon setzen</title>
		<link>http://blog.expedimentum.com/2011/apache_ant_initialer_mode_initiales_template/</link>
		<comments>http://blog.expedimentum.com/2011/apache_ant_initialer_mode_initiales_template/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 21:00:24 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[Apache Ant]]></category>
		<category><![CDATA[XSLT und XPath]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=351</guid>
		<description><![CDATA[Ein schönes Feature von XSLT&#160;2.0 ist, dass man ein Stylesheet in einem initialen Mode oder mit einem initialen Template starten kann (siehe Standard). Ich benutze diese Möglichkeit gern, um Selbsttests direkt im Stylesheet unterzubringen und über einen initialen Mode auszuführen – ohne die eigentliche Logik des Stylesheets zu beeinflussen. In OxygenXML kann man den initialen [...]]]></description>
			<content:encoded><![CDATA[<p>Ein schönes Feature von <a href="http://blog.expedimentum.com/glossar/xslt/" >XSLT</a>&nbsp;2.0 ist, dass man ein Stylesheet in einem initialen Mode oder mit einem initialen Template starten kann (siehe <a href="http://www.w3.org/TR/xslt20/#initiating">Standard</a>). Ich benutze diese Möglichkeit gern, um Selbsttests direkt im Stylesheet unterzubringen und über einen initialen Mode auszuführen – ohne die eigentliche Logik des Stylesheets zu beeinflussen.</p>
<p>In <a href="http://blog.expedimentum.com/oxygen/" >OxygenXML</a> kann man den initialen Mode oder das initiale Template prima im Transformationsszenario einstellen, der kleine Button mit dem rasenden Zahnrädchen neben der Auswahlliste für die Transformations-Engine öffnet den passenden Einstellungs-Dialog (siehe <a href="http://www.oxygenxml.com/doc/ug-oxygen/topics/defining-new-transformation-scenario.html#defining-new-transformation-scenario__advanced-transform-options-dialog">Dokumentation</a>).</p>
<p>Schon vor geraumer Zeit wollte ich diese Feature auch mit <a href="http://blog.expedimentum.com/glossar/apache-ant/" >Apache Ant</a> nutzen, bin aber wegen <a href="http://markmail.org/thread/7hzgqbzdej4vryc4">fehlender Unterstützung durch Saxon</a> und einen zwischenzeitlichen <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=49271">Ant-Bug in Version 1.8.1</a> nicht weitergekommen. Inzwischen wurden <a href="http://blog.expedimentum.com/glossar/saxon/" >Saxon</a> und <a href="http://blog.expedimentum.com/glossar/apache-ant/" >Ant</a> aktualisiert, so dass es Zeit für einen neuen Anlauf war. Die größte Herausforderung war, die jeweils passende URI für die beiden Features zu finden, letztendlich habe ich in die Saxon-Quelltexte geschaut. So geht’s:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;test&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xslt</span> <span style="color: #000066;">in</span>=<span style="color: #ff0000;">&quot;input.xml&quot;</span> <span style="color: #000066;">out</span>=<span style="color: #ff0000;">&quot;output.xml&quot;</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;stylesheet.xsl&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #808080; font-style: italic;">&lt;!-- Pfad zu Saxon an lokale Installation anpassen! --&gt;</span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;classpath</span> <span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;saxon9he.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;factory</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;net.sf.saxon.TransformerFactoryImpl&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #808080; font-style: italic;">&lt;!-- hier ggfs. &quot;http://saxon.sf.net/feature/initialTemplate&quot; einsetzen --&gt;</span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;attribute</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;http://saxon.sf.net/feature/initialMode&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;MyMode&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/factory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xslt<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Über die Factory-Attribute können auch viele weitere Saxon-Optionen – die oft auch über die Kommandozeile zu erreichen sind – von Ant aus gesteuert werden, etwa der Umgang mit Whitespace (<code>http://saxon.sf.net/feature/strip-whitespace</code>) oder die Zeilennummerierung (<code>http://saxon.sf.net/feature/linenumbering</code>). Das habe ich allerdings nicht getestet.</p>
<p><strong>Quellen:</strong></p>
<ul>
<li><a href="http://ant.apache.org/manual/Tasks/style.html">http://ant.apache.org/manual/Tasks/style.html</a> (unter »factory (&#8216;trax&#8217; processors only)« und »Using factory settings«)</li>
<li><a href="http://saxonica.com/documentation/configuration/config-interfaces/jaxp-configuration.xml">http://saxonica.com/documentation/configuration/config-interfaces/jaxp-configuration.xml</a></li>
<li><a href="http://saxonica.com/documentation/javadoc/constant-values.html#net.sf.saxon.lib.FeatureKeys.XSLT_INITIAL_MODE">http://saxonica.com/documentation/javadoc/constant-values.html</a> in Verbindung mit <a href="http://saxonica.com/documentation/javadoc/net/sf/saxon/TransformerFactoryImpl.html#setAttribute%28java.lang.String,%20java.lang.Object%29">http://saxonica.com/documentation/javadoc/net/sf/saxon/TransformerFactoryImpl.html</a> und <a href="http://saxonica.com/documentation/javadoc/net/sf/saxon/lib/FeatureKeys.html">http://saxonica.com/documentation/javadoc/net/sf/saxon/lib/FeatureKeys.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2011/apache_ant_initialer_mode_initiales_template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Ant 1.8.2 unter Mac OS X einrichten</title>
		<link>http://blog.expedimentum.com/2011/apache-ant-1-8-2-unter-mac-os-x-einrichten/</link>
		<comments>http://blog.expedimentum.com/2011/apache-ant-1-8-2-unter-mac-os-x-einrichten/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 02:59:33 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[Apache Ant]]></category>
		<category><![CDATA[Mac OS X]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=339</guid>
		<description><![CDATA[Weil Ant 1.8.1 im XSLT-Task vergisst, den Classpath auszulesen, funktionieren mit dieser Version keine XSLT-2.0-Stylesheets (näheres siehe Bugzilla). Und weil Apple auch zwei Monate nach Erscheinen von Version 1.8.2 (mit dem Bugfix) noch kein Update durchgeführt hat, musste ich von Hand für Abhilfe sorgen. So geht’s: Ant 1.8.2 herunterladen und entpacken Ich habe den entpackten [...]]]></description>
			<content:encoded><![CDATA[<p>Weil <a href="http://blog.expedimentum.com/glossar/apache-ant/" >Ant</a> 1.8.1 im <a href="http://blog.expedimentum.com/glossar/xslt/" >XSLT</a>-Task vergisst, den Classpath auszulesen, funktionieren mit dieser Version keine XSLT-2.0-Stylesheets (näheres siehe <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=49271">Bugzilla</a>). Und weil Apple auch zwei Monate nach Erscheinen von Version 1.8.2 (mit dem Bugfix) noch kein Update durchgeführt hat, musste ich von Hand für Abhilfe sorgen. So geht’s:</p>
<ol>
<li>Ant 1.8.2 herunterladen und entpacken</li>
<li>Ich habe den entpackten Ordner unter <code>~/Applications</code> abgelegt, gleich neben der alten 1.8.0-Version. Bei mir sieht das dann so aus:<br/><br/>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">localhost:Applications stf$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-F</span> <span style="color: #660033;">-1</span>
Crane-xslstyle-<span style="color: #000000;">20100817</span>-0240z<span style="color: #000000; font-weight: bold;">/</span>
apache-ant-1.8.0<span style="color: #000000; font-weight: bold;">/</span>
apache-ant-1.8.2<span style="color: #000000; font-weight: bold;">/</span>
calabash-0.9.24<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

</li>
<li>Erzeugen eines SymLinks auf den Ant-Ordner. Dazu ein Terminalfenster öffnen und<br/><br/>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> ~<span style="color: #000000; font-weight: bold;">/</span>Applications<span style="color: #000000; font-weight: bold;">/</span>apache-ant-1.8.2 ~<span style="color: #000000; font-weight: bold;">/</span>Applications<span style="color: #000000; font-weight: bold;">/</span>ant</pre></div></div>

<p>eingeben. Durch Umbiegen des SymLinks auf ein anderes Verzeichnis kann man einfach auf andere Ant-Versionen umschalten: auf eine ältere oder später auch auf eine neuere.</li>
<li>Jetzt muss man <code>bash</code> – dem Programm hinter dem Terminalfenster – noch sagen, dass es die neue Ant-Version benutzen soll. Dazu fügt man der PATH-Variablen dem Pfad zum neuen Ant-Verzeichnis hinzu. Ich habe dazu im Benutzerverzeichnis eine Datei <code>./bash_profile</code> angelegt und folgendes hineingeschrieben:<br/><br/>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> running ~<span style="color: #000000; font-weight: bold;">/</span>.bash_profile
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=~<span style="color: #000000; font-weight: bold;">/</span>Applications<span style="color: #000000; font-weight: bold;">/</span>ant<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #007800;">$PATH</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ANT_HOME</span>=~<span style="color: #000000; font-weight: bold;">/</span>Applications<span style="color: #000000; font-weight: bold;">/</span>ant</pre></div></div>

<p>Die erste Zeile gibt bei jedem Konsolenstart eine Statusmeldung aus, die zweite Zeile setzt die PATH-Umgebungsvariable, die dritte Zeile sorgt dafür, das Ant seine Dateien findet.<br />
Da verborgene Dateien (mit Punkt am Anfang des Dateinamens) im Finder standardmäßig ausgeblendet werden, habe ich ganz UNIX-like auf der Konsole gearbeitet. Mit<br/><br/></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pico ~<span style="color: #000000; font-weight: bold;">/</span>.bash_profile</pre></div></div>

<p>wird der Editor geöffnet, Speichern funktioniert über <code>CTRL-o</code>, Verlassen mit <code>CTRL-x</code>.<br/></li>
<li>Eine neues Terminalfenster starten. In der zweiten Zeile sollte jetzt soetwas wie <code>running /Users/stf/.bash_profile</code> stehen. Mit dem Terminal-Kommando<br/>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">set</span></pre></div></div>

<p>lässt sich eine Liste der Umgebunsvariablen ausgeben, hier sollten jetzt für <code>PATH</code> und <code>ANT_HOME</code> die neuen Werte angezeigt werden. Schließlich bringt die Versionsangabe mit</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ant <span style="color: #660033;">-v</span></pre></div></div>

<p>Gewissheit, ob alles geklappt hat.
</li>
</ol>
<p>Meine Helferlein auf diesem Weg waren die beiden unten angegebenen Artikel sowie <code>man ln</code> und <code>man ls</code>.</p>
<p>Hoffen wir, dass Apple bald auf 1.8.2 aktualisiert und zukünftig solche Workarounds nicht mehr notwendig sind …</p>
<p><strong>Quellen:</strong></p>
<ul>
<li><a href="http://stackoverflow.com/questions/4810089/how-to-use-an-alternate-version-of-apache-ant-on-os-x-without-installing-over-exi">Stackoverflow: How to use an alternate version of Apache Ant on OS X without installing over existing version?</a> (englisch)</li>
<li>Cameron Hayne: <a href="http://hayne.net/MacDev/Notes/unixFAQ.html#executionPath">Unix FAQ (for OS X)</a> (englisch) – eine sehr übersichtliche Seite mit dem wichtigsten, was man über UNIX unter Mac OS X wissen muss.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2011/apache-ant-1-8-2-unter-mac-os-x-einrichten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EPUB-Beispiel aus Wikipedia</title>
		<link>http://blog.expedimentum.com/2010/epub-beispiel-aus-wikipedia/</link>
		<comments>http://blog.expedimentum.com/2010/epub-beispiel-aus-wikipedia/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 11:29:00 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[Beispiele]]></category>
		<category><![CDATA[EPUB]]></category>
		<category><![CDATA[Wikipedia]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=325</guid>
		<description><![CDATA[Die Beispiele aus dem Wikipedia-Artikel EPUB ergeben ein vollständiges E-Book. Leider kann man bei Commons noch keine EPUBs hochladen, siehe https://bugzilla.wikimedia.org/show_bug.cgi?id=17858. Ich habe deshalb die dazugehörigen Dateien und das EPUB in der Beispielsammlung abgelegt.]]></description>
			<content:encoded><![CDATA[<p>Die Beispiele aus dem Wikipedia-Artikel <a href="http://de.wikipedia.org/wiki/EPUB">EPUB</a> ergeben ein vollständiges E-Book. Leider kann man bei Commons noch keine EPUBs hochladen, siehe <a href="https://bugzilla.wikimedia.org/show_bug.cgi?id=17858">https://bugzilla.wikimedia.org/show_bug.cgi?id=17858</a>. Ich habe deshalb die dazugehörigen Dateien und das EPUB in der <a href="http://www.expedimentum.org/example/EPUB/">Beispielsammlung</a> abgelegt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2010/epub-beispiel-aus-wikipedia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XSLT/XPath: arithmetische Operationen mit einer Leersequenz</title>
		<link>http://blog.expedimentum.com/2010/xslt-xpath-arithmetische-operationen-mit-leersequenz/</link>
		<comments>http://blog.expedimentum.com/2010/xslt-xpath-arithmetische-operationen-mit-leersequenz/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 19:51:16 +0000</pubDate>
		<dc:creator>Stf</dc:creator>
				<category><![CDATA[XSLT und XPath]]></category>

		<guid isPermaLink="false">http://blog.expedimentum.com/?p=310</guid>
		<description><![CDATA[Neues aus der Serie »Man lernt nie aus&#8230;«: Ist bei arithmetischen Operationen einer der Operanden die empty sequence, so ist das Ergebnis bei XSLT/XPath&#160;1.0 NaN (»not a number«), bei XSLT/XPath&#160;2.0 aber die empty sequence. Dieses Verhalten ist im XPath-Standard unter 3.4 Arithmetic Expressions definiert. Ich stand vor dem Problem, eine Variable, die entweder eine xs:decimal-Zahl [...]]]></description>
			<content:encoded><![CDATA[<p>Neues aus der Serie »Man lernt nie aus&#8230;«: Ist bei arithmetischen Operationen einer der Operanden die <code>empty sequence</code>, so ist das Ergebnis bei <a href="http://blog.expedimentum.com/glossar/xslt/" >XSLT</a>/<a href="http://blog.expedimentum.com/glossar/xpath/" >XPath</a>&nbsp;1.0 <code>NaN</code> (»not a number«), bei XSLT/XPath&nbsp;2.0 aber die <code>empty sequence</code>. Dieses Verhalten ist im XPath-Standard unter <a href="http://www.w3.org/TR/xpath20/#id-arithmetic">3.4 Arithmetic Expressions</a> definiert.</p>
<p>Ich stand vor dem Problem, eine Variable, die entweder eine <code>xs:decimal</code>-Zahl oder aber auch die Leersequenz enthält, in eine gültige Instanz von <code>xs:decimal</code> umzuwandeln, d.h. statt der Leersequenz sollte 0 geliefert werden. Es ist gängige Programmiertechnik, eine Leersequenz durch Anhängen eines Leerstrings – z.B. <code>xs:string(&nbsp;(&nbsp;(), '')&nbsp;)</code> – in eine gültige Instanz von <code>xs:string</code> (d.h. einen Leerstring) umzuwandeln. Die analoge Technik – Addieren einer Null zu einer Leersequenz – funktioniert aber wegen des im Standard definierten Verhaltens nicht. Abhilfe schafft bei XSLT&nbsp;2.0 eine spezielle Funktion:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:function</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;xsb:force-cast-to-integer&quot;</span> <span style="color: #000066;">as</span>=<span style="color: #ff0000;">&quot;xs:decimal&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;input&quot;</span> <span style="color: #000066;">as</span>=<span style="color: #ff0000;">&quot;xs:string?&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:when</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;$input castable as xs:decimal&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:sequence</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;xs:decimal($input)&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:when<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:sequence</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;0&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:function<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>oder kürzer:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:function</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;xsb:force-cast-to-integer&quot;</span> <span style="color: #000066;">as</span>=<span style="color: #ff0000;">&quot;xs:decimal&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;input&quot;</span> <span style="color: #000066;">as</span>=<span style="color: #ff0000;">&quot;xs:string?&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:sequence</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;if ($input castable as xs:decimal) then xs:decimal($input) else 0&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:function<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Außer bei Leerstring und Leersequenz gibt diese Funktion auch bei nicht konvertierbaren Strings (wie z.B. römischen Zahlen) <code>0</code> zurück (was bei mir häufig das gewünschte Verhalten ist), aber die Beschränkung auf Leerstring und Leersequenz lässt sich einfach durch Ersetzen von <code>$input castable as xs:decimal</code> mit <code>normalize-space($input)</code> erzielen.</p>
<p><strong>Nachtrag: </strong><br />
<a href="http://www.datenverdrahten.de/">Thomas Meinicke</a> merkte zum Rechnen mit Leersequenzen an, dass man zuerst mit <code>exists()</code> oder <code>empty()</code> prüfen kann, ob eine Sequenz leer ist, um dann den resultierenden Wahrheitswert in <code>xs:decimal</code> zu casten, etwa so: <code>xs:decimal(exists(&nbsp;()&nbsp;)&nbsp;)</code>. Achtung: Dabei wird die Leersequenz zu <code>0</code>, während der Leerstring zu <code>1</code> wird.</p>
<p><strong>Nachtrag II:</strong><br />
Leersequenzen führen auch bei Vergleichs-Operationen zur Rückgabe einer Leersequenz, siehe im XPath-Standard unter <a href="http://www.w3.org/TR/xpath20/#id-value-comparisons">3.5.1 Value Comparisons</a>. Da Leersequenzen zu <code>false()</code> evaluiert werden, ergibt beispielsweise <code>() eq ()</code> immer <code>false()</code>. Um zu testen, ob eine Leersequenz vorliegt, muss deshalb <code>empty()</code> oder <code>exist()</code> verwendet werden. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.expedimentum.com/2010/xslt-xpath-arithmetische-operationen-mit-leersequenz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

