JanineS123: XSL | Satz in einzelne Wörter zerlegen

Beitrag lesen

So, jetzt habe ich nochmal weitergebastelt.

Folgender Quellcode:

<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<def>
		<term>Abhilfemaßnahme (FDA)</term>
		<descr>Routine-Instandhaltung oder Wartung eines Gerätes etc.</descr>
	</def>
	<def>
		<term>Routine</term>
		<descr>Hier taucht der Begriff Abhilfemaßnahme (FDA) auf.</descr>
	</def>
	<def>
		<term>Gerät</term>
		<descr>Dies ist ein Test für Routine und Abhilfemaßnahme (FDA).</descr>
	</def>
</definitions>

Mit diesem ersten Stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="#all">
	<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
	<xsl:template match="definitions">
		<xsl:variable name="term" select="def/term"/>
		<all>
			<xsl:for-each select="//def">
				<xsl:variable name="actdef" select="."/>
				<def>
					<xsl:attribute name="actterm" select="$actdef/term"/>
					<xsl:attribute name="actdescr" select="$actdef/descr"/>
					<terms>
						<xsl:for-each select="$term">
							<xsl:variable name="actterm" select="$actdef/term"/>
							<xsl:if test="fn:contains($actdef/descr, .)">
								<term>
									<xsl:value-of select="fn:substring-before($actdef/descr, .)"/>
									<xsl:text>&lt;a&gt;</xsl:text>
										<xsl:value-of select="."/>
									<xsl:text>&lt;/a&gt;</xsl:text>
									<xsl:value-of select="fn:substring-after($actdef/descr, .)"/>
								</term>
							</xsl:if>
						</xsl:for-each>
					</terms>
				</def>
			</xsl:for-each>
		</all>
	</xsl:template>
</xsl:stylesheet>

Erhalte ich die folgende Ausgabe (hier werden die Begriffe noch doppelt geschrieben):

<?xml version="1.0" encoding="UTF-8"?>
<all>
	<def actterm="Abhilfemaßnahme (FDA)" actdescr="Routine-Instandhaltung oder Wartung eines Gerätes etc.">
		<terms>
			<term>&lt;a&gt;Routine&lt;/a&gt;-Instandhaltung oder Wartung eines Gerätes etc.</term>
			<term>Routine-Instandhaltung oder Wartung eines &lt;a&gt;Gerät&lt;/a&gt;es etc.</term>
		</terms>
	</def>
	<def actterm="Routine" actdescr="Hier taucht der Begriff Abhilfemaßnahme (FDA) auf.">
		<terms>
			<term>Hier taucht der Begriff &lt;a&gt;Abhilfemaßnahme (FDA)&lt;/a&gt; auf.</term>
		</terms>
	</def>
	<def actterm="Gerät" actdescr="Dies ist ein Test für Routine und Abhilfemaßnahme (FDA).">
		<terms>
			<term>Dies ist ein Test für Routine und &lt;a&gt;Abhilfemaßnahme (FDA)&lt;/a&gt;.</term>
			<term>Dies ist ein Test für &lt;a&gt;Routine&lt;/a&gt; und Abhilfemaßnahme (FDA).</term>
		</terms>
	</def>
</all>

Und auf diese Ausgabe wende ich nun das 2. Stylesheet an (geht das auch in einem Schritt?):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="#all">
	<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
	<xsl:template match="all">
		<all>
			<xsl:for-each select="def">
				<def>
					<xsl:attribute name="actterm" select="@actterm"/>
					<xsl:attribute name="actdescr" select="@actdescr"/>
					<descr>
						<xsl:choose>
							<xsl:when test="fn:count(terms/term) > 1"><!--Für alle Elemente mit mehr als einer Beschreibung...-->
								<xsl:variable name="text" select=""/><!--... soll zunächst eine leere Variable angelegt werden.-->
								<xsl:for-each select="terms/term">
									<xsl:variable name="text">
										<xsl:value-of select="$text"/><!--Die leere Variable wird hier aufgerufen und der neue Wert in die gleiche Variable gespeichert.-->
										<xsl:copy-of select="fn:substring-before(., '&lt;/a&gt;')"/>
										<xsl:text>&lt;/a&gt;</xsl:text>
									</xsl:variable>
								</xsl:for-each>
								<xsl:value-of select="$text"/><!--Hier wird meine zusammengesetzte Variable ausgegeben.-->
							</xsl:when>
							<xsl:otherwise>
								<xsl:copy-of select="terms/term"/>
							</xsl:otherwise>
						</xsl:choose>
					</descr>
				</def>
			</xsl:for-each>
		</all>
	</xsl:template>
</xsl:stylesheet>

Leider funktioniert das hier noch nicht so wie es soll. Ohne <xsl:for-each select="terms/term"> klappt es: also nur durch Ausgabe von <xsl:copy-of select="fn:substring-before(terms/term[1], '&lt;/a&gt;')"/> Es ist auch noch ein Fehler bei der Definition der leeren Variablen, den ich nicht verstehe.

Siehst du hier meinen Fehler?

Ziel sollte etwas in dieser Art sein:

<?xml version="1.0" encoding="UTF-8"?>
<all>
	<def actterm="Abhilfemaßnahme (FDA)" actdescr="Routine-Instandhaltung oder Wartung eines Gerätes etc.">
		<descr>&lt;a&gt;Routine&lt;/a&gt;-Instandhaltung oder Wartung eines &lt;a&gt;Gerät&lt;/a&gt;es etc.</descr>
	</def>
	<def actterm="Routine" actdescr="Hier taucht der Begriff Abhilfemaßnahme (FDA) auf.">
		<descr>Hier taucht der Begriff &lt;a&gt;Abhilfemaßnahme (FDA)&lt;/a&gt; auf.</descr>
	</def>
	<def actterm="Gerät" actdescr="Dies ist ein Test für Routine und Abhilfemaßnahme (FDA).">
		<descr>Dies ist ein Test für &lt;a&gt;Routine&lt;/a&gt; und &lt;a&gt;Abhilfemaßnahme (FDA)&lt;/a&gt;.</descr>
	</def>
</all>

Viele Grüße, Janine