JanineS: XSL | Satz in einzelne Wörter zerlegen

Beitrag lesen

Hallo zusammen,

ich habe ein Glossar mit verschiedenen Begriffen und Beschreibungen. Innerhalb der Beschreibungen kommen wieder einige definierte Begriffe vor, die ich gerne verlinken möchte. Dazu muss ich aber erstmal herausfinden, welche Begriffe aus den Beschreibungen als Begriff im Glossar definiert sind.

Ich habe also beispielsweise die folgende Quelldatei:

<?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>

Ich möchte nun also zunächst (die Schleife bastel ich später drumrum) innerhalb der ersten Beschreibung die Begriffe "Routine-Instandhaltung" und "Gerätes" erkennen, da "Routine" und "Gerät" definierte Begriffe sind.

Jetzt dachte ich, ich zerlege zuerst mit regex meinen descr-String in einzelne Begriffe und prüfe dann mit einer Schleife, ob diese Bestandteil von def/term sind. Das klappt auch soweit ganz gut, nur mit dem Bindestrich zwischen Routine-Instandhaltung kommt mein Code nicht so gut klar. Habt ihr eine Ahnung, was ich falsch gemacht habe? Oder gibt es einfachere/bessere Lösungen, die mich zum Ziel führen werden?

<?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"/>
		<xsl:variable name="actdef" select="def[1]"/>
		<xsl:variable name="actdefdescr" select="fn:concat(' ', $actdef/descr, ' ')"/>
		<xsl:variable name="actdescr">
			<xsl:analyze-string select="$actdefdescr" regex="( )?([A-ZÄÖÜ]*[a-zäöü]*[0-9]*[-,.;]*)( )">
				<xsl:matching-substring>
					<txt><xsl:value-of select="regex-group(2)"/></txt>
				</xsl:matching-substring>
				<xsl:non-matching-substring>
					<xsl:value-of select="$actdef/descr"/>
				</xsl:non-matching-substring>
			</xsl:analyze-string>
		</xsl:variable>
		<def>
			<xsl:attribute name="actterm" select="$actdef/term"/>
			<xsl:attribute name="actdescr" select="$actdef/descr"/>
			<link>
				<xsl:for-each select="$actdescr/txt">
				<txt><xsl:value-of select="."/></txt>
				</xsl:for-each>
			</link>
		</def>
	</xsl:template>
</xsl:stylesheet>

Meine bisherige Ausgabe sieht so aus. Ich habe unter @actterm und @actdescr noch einmal die Quelle angegeben, damit ich mein Ergebnis leichter überprüfen kann. Darunter sollten alle einzelnen Wörter gelistet werden. Diese Liste würde ich dann in einem späteren Schritt abgleichen mit der Liste meiner Glossarbegriffe, die ich einfach in einer Variable speichere.

<?xml version="1.0" encoding="UTF-8"?>
<def actterm="Abhilfemaßnahme (FDA)" actdescr="Routine-Instandhaltung oder Wartung eines Gerätes etc.">
	<link>
		<txt></txt>
		<txt>Instandhaltung</txt>
		<txt>oder</txt>
		<txt>Wartung</txt>
		<txt>eines</txt>
		<txt>Gerätes</txt>
		<txt>etc.</txt>
	</link>
</def>

Viele Grüße und danke schonmal, Janine

akzeptierte Antworten