<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:test="something"
	xmlns:doc="http://www.CraneSoftwrights.com/ns/xslstyle"
	xmlns:docv="http://www.CraneSoftwrights.com/ns/xslstyle/vocabulary"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	exclude-result-prefixes="doc docv"
	
	xmlns:java-file="java:java.io.File"
	xmlns:java-fos="java:java.io.FileOutputStream"
	xmlns:java-uri="java:java.net.URI"
	
	version="2.0">
	<!--  -->
	<!--  -->
	<!--  -->
	<doc:doc filename="binaerdaten-ausgabe_java.xsl" internal-ns="docv" global-ns="doc test" vocabulary="DocBook" info="$Revision: 111 $, $Date: 2010-07-10 00:45:43 +0200 (Sa, 10 Jul 2010) $">
		<doc:title>Binärdatenausgabe mit Java</doc:title>
		<para>Dieses Stylesheet ist ein Beispiel für die Ausgabe eines Binärdatenstroms mit Java.
			Außerdem wird per XSLT ein HexBinary-String in eine Sequenz von Bytes umgewandelt.</para>
		<para>Erläuterungen dazu finden sich unter <link xlink:href="http://blog.expedimentum.com/2010/java-in-xslt-verwenden/">http://blog.expedimentum.com/2010/java-in-xslt-verwenden/</link>.</para>
		<para><emphasis role="bold">Achtung:</emphasis> Der eingesetzte XSLT-Prozessor muss Java unterstützen. Diese Stylesheet wurde erfolgreich mit
			Saxon-B 8.9.0.4, Saxon-B 9.1.0.7, Saxon-PE/EE 9.2.0.6 (Oxygen build), AltovaXML (Build 2009-10-23) und AltovaXML2010_rel3sp1 getestet.</para>
		<para>Autor: <author>
			<firstname>Stefan</firstname>
			<surname>Krause</surname>
		</author>
		</para>
		<para>Homepage: <link xlink:href="http://www.expedimentum.org/">http://www.expedimentum.org/</link></para>
		<para>Lizenz: Dieses Stylesheet ist unter einer einer Creative Commons-Lizenz (<link xlink:href="http://creativecommons.org/licenses/by/3.0/">CC-BY&#160;3.0</link>) lizenziert. Die Weiternutzung ist bei Namensnennung erlaubt.</para>
		<revhistory>
			<revision>
				<revnumber>0.110</revnumber>
				<date>2010-07-07</date>
				<authorinitials>Stf</authorinitials>
				<revremark>initiale Version</revremark>
			</revision>
		</revhistory>
	</doc:doc>
	<!--  -->
	<!--  -->
	<!-- __________     test:write-hexBinary-to-file()     __________ -->
	<doc:function>
		<doc:param name="hexBin"><para>HexBinary-String, der ausgegeben werden soll.</para></doc:param>
		<doc:param name="OutputFileURI"><para>absolute URI (Pfad) zur Ausgabe-Datei.</para></doc:param>
		<para>Diese Funktion gibt einen HexBinary-codierten String als Binärdatei aus.</para>
	</doc:function>
	<!--  -->
	<!-- erfolgreich getestet mit AltovaXML (Build 2009-10-23), saxon8.9.0.4.jar, saxon9.1.0.7.jar, Saxon PE/HE 9.2.0.6 (Oxygen build) -->
	<!--  -->
	<xsl:function name="test:write-hexBinary-to-file">
		<xsl:param name="hexBin" as="xs:hexBinary?"/>
		<xsl:param name="OutputFileURI" as="xs:anyURI"/>
		<xsl:variable name="fostream" select="java-fos:new(java-file:new(java-uri:new($OutputFileURI) ) )"/>
		<!-- das Objekt für die Methode wird als erster Parameter übergeben. -->
		<xsl:value-of select="java-fos:write($fostream, test:tokenize-HexBinary($hexBin) )"/>
	</xsl:function>
	<!--  -->
	<!--  -->
	<!-- __________     test:tokenize-HexBinary()     __________ -->
	<doc:function>
		<doc:param name="hexBin"><para>HexBinary-String, der in eine Sequenz von Bytes umgewandelt werden soll.</para></doc:param>
		<para>Diese Funktion wandelt einen HexBinary-String in eine Sequenz von Bytes um.</para>
	</doc:function>
	<xsl:function name="test:tokenize-HexBinary" as="xs:integer*">
		<xsl:param name="hexBin" as="xs:hexBinary"/>
		<xsl:sequence select="for $i in ( (1 to string-length(string($hexBin) ) )[. mod 2 eq 1] ) return test:hex-to-byte(substring(xs:string($hexBin), $i, 2))"/>
	</xsl:function>
	<!--  -->
	<!--  -->
	<!-- __________     test:hex-to-byte()     __________ -->
	<doc:function>
		<doc:param name="hexOctet"><para>Hexadezimal codiertes Oktett (z.B. "01", "1A", "FF")</para></doc:param>
		<para>Diese Funktion wandelt ein hexadezimal codiertes Oktett in ein vorzeichenbehaftetes Byte um.</para>
	</doc:function>
	<xsl:function name="test:hex-to-byte" as="xs:integer">
		<xsl:param name="hexOctet" as="xs:string"/>
		<xsl:choose>
			<xsl:when test="matches($hexOctet, '^[0-9A-Z]{2}$')">
				<xsl:variable name="temp" select="test:hexchar-to-int(substring($hexOctet,1,1) ) * 16 + test:hexchar-to-int(substring($hexOctet,2,1) )"/>
				<!-- convert from unsigned integer to signed integer -->
				<xsl:choose>
					<xsl:when test="$temp lt 128">
						<xsl:sequence select="$temp"/>
					</xsl:when>
					<xsl:otherwise>
						<xsl:sequence select="-(256-$temp)"/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:when>
			<xsl:otherwise>
				<xsl:message terminate="yes">FATAL: test:hex-to-byte(): ungültige Eingabe: "<xsl:sequence select="$hexOctet"/>"</xsl:message>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:function>
	<!--  -->
	<!--  -->
	<!-- __________     test:hexchar-to-int()     __________ -->
	<doc:function>
		<doc:param name="hexchar"><para>ein einzelnes hexadezimales Zeichen (z.B. "0", "7", "B")</para></doc:param>
		<para>Diese Funktion wandelt ein hexadezimal codiertes Zeichen in einen Integer zwischen 0 und 15 um.</para>
	</doc:function>
	<xsl:function name="test:hexchar-to-int" as="xs:integer?">
		<xsl:param name="hexchar" as="xs:string"/>
		<xsl:choose>
			<xsl:when test="matches($hexchar, '^[0-9A-F]$' )">
				<xsl:sequence select="index-of( ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'), $hexchar ) - 1"/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:message terminate="yes">FATAL: test:hexchar-to-int(): ungültige Eingabe: "<xsl:sequence select="$hexchar"/>"</xsl:message>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:function>
	<!--  -->
	<!--  -->
	<!-- __________     nur zum Test     __________ -->
	<doc:template>
		<para>Diese Template gibt testweise eine PNG-Datei aus.</para>
	</doc:template>
	<xsl:template match="/">
		<xsl:variable name="image" as="xs:hexBinary">89504E470D0A1A0A0000000D494844520000000D0000000F0403000000CD0D5844000000017352474200AECE1CE900000018504C544562129D80418A8851829E7972B09266DCD946F4FF39FEFFFC482C1765000000564944415408D725CD2B12C0200C04D030133C0A5D55DD2354A1A3D069A17BFF237403316FF217AC70190ABCD905A5E36ED4CE2FB18EA14F0E51AEB6B484AD6E0F6ED0A95643AB53B1EF94EEC2842517363912F3EBDF0F99462041E4FA77630000000049454E44AE426082</xsl:variable>
		<xsl:message><xsl:value-of select="test:write-hexBinary-to-file($image, xs:anyURI('file:/c:/temp/trash/test.png') )"/></xsl:message>
	</xsl:template>
	<!--  -->
	<!--  -->
	<!--  -->
</xsl:stylesheet>
