Table of Contents

1. Einleitung
2. Kontext
3. Ergebnis
4. Funktionsweise
Ausgabe
HTML-Log
Meldungen als PIs
Links als XPointer

XSLT: HTML-Log mit Links in die Quelldatei

Referent: Heino Schmull


pagina GmbH
72070
Tübingen
Herrenberger Str. 51
Germany  

Stand: 20. November 2015

Chapter 1. Einleitung

Bei einer XSLT-Transformation können im Nachrichtenfenster des oXygen-Editors Textmessages (mit dem Element <xsl:message select="Text">) ausgegeben werden. Oft ist dies nicht ausreichend oder unbefriedigend. Ein im Laufe der Transformation generiertes Protokoll müsste aber eigens geladen werden und verweis meist nur indirekt (Zeilennummer, XPath) auf die XML-Daten.

Im Folgenden möchte ich eine Methode vorstellen, ein formatiertes HTML-Logfile im Nachrichtenfenster auszugeben, das Links direkt an bestimmte Stellen der Ausgangsdaten der Transformation anbietet.

Chapter 2. Kontext

Die Transformationskette, an deren Ende hier beschrieben wird, ist Bestandteil von parsx, dem XML-Framework für Publikumsverlage der Fa. Pagina in Tübingen.

Das hierarchisch strukturierte Datenformat nach Verlags-DTD bildet die Strukur eines weiten Spektrums von Texten vom Fachbuch bis zum Gedichtband detailliert ab, muß für den Import nach Indesign jedoch in eine flachere transformiert werden.

Die Quelldaten müssen dabei gewissen Konventionen genügen. Gibt es schwerwiegende Probleme, d.h. wenn die Datei nicht ohne Textverlust importiert werden kann, werden die Ergebnisdaten verworfen und nur das Log wird ausgegeben.

Chapter 3. Ergebnis

Am Ende der Transformationskette wird ein farbig gegliedertes und mit den XML-Daten verlinktes HTML-Protokoll ausgegeben und bei der Transformation im Nachrichtenfenster angezeigt:

Fehlerausgabe bei der Transformation

Angezeigt wird, neben Meldungstext und XPath, ein Link-Button, der zu der problematischen Stelle im XML führt.

Chapter 4. Funktionsweise

Im Folgenden wird nicht die Transformationskette selber vorgestellt, sondern nur die Erzeugung und Verlinkung des Logfiles:

Ausgabe

Um das Logfile im Nachrichtenfenster auszugeben, wird im letzten Schritt nicht mehr das eigentliche Transformationsergebnis als Output definiert, sondern das HTML-Log (sowohl im Transformationsszenario als auch im <xsl:output/>-Element.) Das Log wird dann per Transformationsszenario "als HTML" im Ergebnisfenster geöffnet, während im Editor nach wie vor die Quelldatei geöffnet ist. Die transformierten Daten selbst werden per <xsl:result-document/> geschrieben.

Erreicht wird dies durch ein root-Template:

<xsl:template match="/">
	
	<xsl:if test="not(//processing-instruction()[name() = $transformationName][starts-with(., $SEVERE)])">
		
		<xsl:result-document href="{$output_uri}" format="result">
			<!-- nur bei gelungener Transformation: output ausgeben -->
			<xsl:apply-templates/>
		</xsl:result-document>
	
	</xsl:if>
	
	<!-- Formular befüllen (Meldungen werden als Reihe von PIs übergeben)	-->
	<xsl:apply-templates select="$log_form" mode="log">
		<xsl:with-param name="transformationName" select="$transformationName" tunnel="yes"/>
		<xsl:with-param name="Meldungen" select="//processing-instruction()[name() = $transformationName]" tunnel="yes"/>
	</xsl:apply-templates>
	
</xsl:template>

HTML-Log

Ein Formular für das Logfile ist in der Variable $log_form als XHTML hinterlegt. Seine divs und spans werden befüllt durch eine Reihe von Temlpates im Mode "log", die nicht auf die Quelldaten matchen, sondern auf das HTML-Formular (<xsl:apply-templates select="$log_form" mode="log">) Die nötigen Inhalte und Daten werden diesen Templates als Tunnel-Parameter übergeben:

	<xsl:template match="div[@class='messages']" mode="log" xpath-default-namespace="http://www.w3.org/1999/xhtml">
		<xsl:param name="transformationName" tunnel="yes"/>
		<xsl:param name="Meldungen" tunnel="yes"/>
		...

Meldungen als PIs

Die Meldungen selber werden im Verlaufe der Transformationskette als PIs 'vor Ort' in die Daten geschrieben – und vor der Ausgabe wieder entfernt. Sie enthalten den Meldungstext, den per saxon:path generierten XPath (hierfür ist Saxon-PE oder -EE nötig) zu der betreffenden Stelle in den Quelldaten und schließlich einen entsprechenden Xpointer. Für den oben gezeigten Screenshot z.B.:

Manchmal benutzt man Worte wie Hamburgefonts, Rafgenduks oder Handgloves, um Schriften zu testen.<?parsx2light [ Schwerwiegend ] | Das Element [marginalie] enthält [marginalie]-Elemente die für InDesign nicht verarbeitet werden können! 
 - XPath |  /projekt/werk[1]/nachspann[1]/kapitel[10]/abs[8]/marginalie[1] 
 - xpointer |  element(1/2/4/10/10/3) 
?></abs></kapitel>
			

Links als XPointer

Im generierten HTML sieht das dann so aus:

<div class="msg-body">
   <table>
      <tbody>
         <tr>
            <td>
               <p>[endnote] kann nur in Kapitel des Hauptteils ausgewertet werden!<br/><span class="xpath">- XPath: /projekt/werk[1]/nachspann[1]/kapitel[10]/abs[8]/endnote[1]</span></p>
            </td>
            <td> </td>
            <td>
               <div class="link"><a class="link-xml" href="parsx_3.0.2_referenzumsetzung.xml#element(1/2/4/10/10/3)"><span style="font-size:80%;">&gt;</span> Zu dieser Stelle im XML springen</a></div>
            </td>
         </tr>
      </tbody>
   </table>
</div>

Der Ausdruck parsx_3.0.2_referenzumsetzung.xml#element(1/2/4/10/10/3) enthält hinter dem Dateinamen einen Xpointer nach dem 'Element'-Schema. Bezeichnet wird hier, ausgehend vom Dokumentknoten, das 1. Kindelemenet (also das Wurzelelement), davon das 2., davon das 4., davon das 10. Kindelement usw. ("childSequence", vgl die entsprechende W3C Recommendation). In dieser vereinfachten Form können nur Elemente und diese nur ohne weitere Bedingungen referenziert werden. Zur Erzeugung genügt eine Funktion, die ancestor- und deren preceding-sibling-Elemente abzählt.

Der Oxygen unterstützt das Element-Schema seit der Version 15.2, darüber hinaus wird inzwischen auch eine Referenz auf Zeile/Spalte sowie auf XML-IDs unterstützt. Die links werden innerhalb des Eidtors unterstützt, ein Aufruf von außen (etwa aus dem Browser) ist betriebssystemspezifisch (Batch-Datei etc.) möglich.