JanineS: XSL | String vor und nach Code auslesen

Beitrag lesen

Hallo Thomas,

ich habe diesen (und noch viele weitere) Codes von meinem Vorgänger geerbt und muss sie nun pflegen, verbessern und erweitern. Ich versuche immer, wenn ich an einem der 1.000 XSL-Stylesheets unter meiner Obhut dran sitze, den Code durch Kommentare besser lesbar zu gestalten und Konventionen zu berücksichtigen. Von daher danke ich dir für deine Kommentare, ich werde die HTML-Seite noch etwas verbessern. Es ist ohnehin geplant, demnächst ein neues Layout über die Seiten zu legen, da lassen sich <ul><li> besser formatieren.

Auch dein Hinweis zu xsl:apply-templates hat mir schon weitergeholfen. Ich habe mich in die Doku dazu nochmal tiefer eingelesen und verstehe nun den Sinn dahinter besser. Man kann xsl:apply-templates überall da verwenden, wo ggf. noch weitere Kindelemente kommen, die mithilfe eines eigenen <xsl:template match="kindelement"> angesprochen werden. Bisher habe ich dafür tatsächlich immer for-each-Schleifen verwendet. Diese Einsicht eröffnet mir nun viele weitere Türen, besten Dank dafür :)

Ich habe, ausgehend von deiner ursprünglichen Lösung, nun den folgenden Testcode entwickelt, der auch für die komplexere Quelldatei funktioniert:

<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="#all" version="2.0">

	<xsl:variable name="lang" select="'de'"/>
	<xsl:variable name="altlang" select="'en'"/>
	<xsl:output method="html" indent="yes"/>
	
	<xsl:template match="/">
		<xsl:apply-templates/>
	</xsl:template>
	
	<xsl:template match="definitions">
		<html>
			<head/>
			<body>
				<div id="dokheader">
					<table>
						<tr>
							<td>
								<xsl:value-of select="definition[1]/term/*[local-name()=$lang]"/>
							</td>
						</tr>
					</table>
				</div>
				<div id="defcontent">
					<xsl:for-each select="definition[1]/description/*[local-name()=$lang]/txt">
						<xsl:choose>
							<xsl:when test="starts-with(.,'- ')">
								<p class="unorderedlist"><xsl:copy><xsl:apply-templates select="substring(.,3)"/></xsl:copy></p>
							</xsl:when>
							<xsl:when test="substring(.,2,1)='.'">
								<p class="orderedlist"><xsl:copy><xsl:apply-templates select="."/></xsl:copy></p>
							</xsl:when>
							<xsl:when test="@format='bold'">
								<p class="bold"><xsl:copy><xsl:apply-templates select="."/></xsl:copy></p>
							</xsl:when>
							<xsl:when test="@format='italic'">
								<p class="italic"><xsl:copy><xsl:apply-templates select="."/></xsl:copy></p>
							</xsl:when>
							<xsl:otherwise>
								<p class="normal"><xsl:copy><xsl:apply-templates select="."/></xsl:copy></p>
							</xsl:otherwise>
						</xsl:choose>
					</xsl:for-each>
				</div>
			</body>
		</html>
	</xsl:template>
	
	<xsl:template match="a">
			<a href="{@href}_{$lang}.html"><xsl:value-of select="."/></a>
	</xsl:template>
	
</xsl:stylesheet>

Danke dir, Thomas, dass du immer wieder auf meine Beiträge antwortest und mir viele hilfreiche Hinweise gibst! Ich lerne noch... zwar langsam, aber es geht voran. ;)

Viele Grüße und dir ein schönes Osterfest, Janine.