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><a></xsl:text>
<xsl:value-of select="."/>
<xsl:text></a></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><a>Routine</a>-Instandhaltung oder Wartung eines Gerätes etc.</term>
<term>Routine-Instandhaltung oder Wartung eines <a>Gerät</a>es etc.</term>
</terms>
</def>
<def actterm="Routine" actdescr="Hier taucht der Begriff Abhilfemaßnahme (FDA) auf.">
<terms>
<term>Hier taucht der Begriff <a>Abhilfemaßnahme (FDA)</a> 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 <a>Abhilfemaßnahme (FDA)</a>.</term>
<term>Dies ist ein Test für <a>Routine</a> 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(., '</a>')"/>
<xsl:text></a></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], '</a>')"/> 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><a>Routine</a>-Instandhaltung oder Wartung eines <a>Gerät</a>es etc.</descr>
</def>
<def actterm="Routine" actdescr="Hier taucht der Begriff Abhilfemaßnahme (FDA) auf.">
<descr>Hier taucht der Begriff <a>Abhilfemaßnahme (FDA)</a> 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 <a>Routine</a> und <a>Abhilfemaßnahme (FDA)</a>.</descr>
</def>
</all>
Viele Grüße, Janine