Janine: Filtern von Trennstrichen (regular expressions)

Beitrag lesen

Hallo miteinander,

seit gestern quäle ich mich mit dem Filter für Trennstriche und hoffe, hier auf gute Anregungen oder Tipps zu kommen.

Ich will folgende vier Problemfälle filtern:

  • Klein- buch- stab- en -> Kleinbuchstaben (Minus & Leerzeichen weg)
  • Groß- Buch- Stab- En -> Groß-Buch-Stab-En (Leerzeichen weg)
  • Reinigungs- oder Hygienevorschrift -> Reinigungs- oder Hygienevorschrift (so belassen)
  • Gedanken - Strich -> Gedanken - Strich (so belassen)

Dazu habe ich die einfache Testdatei:

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<text>
		Klein- buch- stab- en
		Funkt- ionale System- risiko- analyse
		Projekt- organisa- tions- plan
		
		Groß- Buch- Stab- En
		Maschinen- Risiko- analyse
		Ferti- gungs- Prüf- vor- schrift
		
		und oder
		Prozess- und Komponenten- manage- ment- plan
		Reinigungs- oder Hygiene- vorschrift
		
		Gedanken - Strich
		Prozess- über- sicht - Stufe 2
		Entwickler - Software
	</text>
</root>

Für den Fall 1-3 funktioniert das folgende Skript ganz prima:

<xsl:template match="//text">
		<root>
			<xsl:variable name="fstChange">
				<xsl:analyze-string select="." regex="-(&#xa;|\s|\n)([A-Z])">
					<xsl:matching-substring>-<xsl:value-of select="regex-group(2)"/></xsl:matching-substring>
					<xsl:non-matching-substring><xsl:value-of select="."/></xsl:non-matching-substring>
				</xsl:analyze-string>
			</xsl:variable>
			<xsl:variable name="finalChange">
				<xsl:analyze-string select="$fstChange" regex="-(&#xa;|\s|\n| )(and|und|oder|or )?">
					<xsl:matching-substring>
						<xsl:choose>
							<xsl:when test="regex-group(2) = 'und'">- und</xsl:when>
							<xsl:when test="regex-group(2) = 'oder'">- oder</xsl:when>
							<xsl:when test="regex-group(2) = 'and'">- and</xsl:when>
							<xsl:when test="regex-group(2) = 'or'">- or</xsl:when>
							<xsl:otherwise></xsl:otherwise>
						</xsl:choose>
					</xsl:matching-substring>
					<xsl:non-matching-substring><xsl:value-of select="."/></xsl:non-matching-substring>
				</xsl:analyze-string>
			</xsl:variable>
			<xsl:value-of select="$finalChange"/>
		</root>
	</xsl:template>

Und für die Gedankenstriche klappt das hier:

<xsl:template match="//text">
		<root>
			<xsl:variable name="finalChange">
				<xsl:analyze-string select="." regex="(&#xa;|\s|\n)-(&#xa;|\s|\n)">
					<xsl:matching-substring><xsl:value-of select="regex-group(1)"/>-<xsl:value-of select="regex-group(2)"/></xsl:matching-substring>
					<xsl:non-matching-substring><xsl:value-of select="."/></xsl:non-matching-substring>
				</xsl:analyze-string>
			</xsl:variable>
			<xsl:value-of select="$finalChange"/>
		</root>
	</xsl:template>

Mein Problem ist nun, beides zusammenzupacken. Wenn ich alles in ein Template schreibe (mit der Variablen "secChange"), wird meine Gedankenstrich-Variable dennoch übergangen. Habt ihr eine Ahnung, warum? Oder gibt es eine elegantere Möglichkeit?

Bin für jeden Hinweis dankbar! Liebe Grüße, Janine

akzeptierte Antworten