<?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 &#187; Allgemeines</title>
	<atom:link href="http://blog.expedimentum.com/kategorien/allgemeines/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.expedimentum.com</link>
	<description>Texte und Metadaten verarbeiten. Fundstücke und Beispiele</description>
	<lastBuildDate>Thu, 17 May 2012 10:13:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<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-sb/" >XSLT-SB</a> 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>
	</channel>
</rss>

