Hallo zusammen,
Mit XSLT 2.0 ist es auch nicht so einfach. Falls du mit replace() nicht klar kommst.
Ich versuch's mal. Disclaimer: Ich hab keine Ahnung von XSLT 2 und probiert einfach nur mal meine Lösungsvorstellung mit bestehenden Elementen zu realisieren:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="tag:tepasse.org,2007-06-19:xslt/root"
xmlns:my="tag:tepasse.org,2007-06-19:xslt/my"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all">
<xsl:output encoding="UTF-8"
indent="yes"
undeclare-prefixes="yes"
method="xml" />
<xsl:param name="text">
Diés ist ein Töxt mit Ümläuten und scharfem Eß. Öder ätwa nücht?
</xsl:param>
<xsl:function name="my:translate">
<xsl:param name="text" as="xs:string"/>
<xsl:param name="mappings" as="xs:string"/>
<xsl:param name="alternates" as="xs:string"/>
<xsl:variable name="prestrings"
select="tokenize($mappings, '\s+')"/>
<xsl:variable name="poststrings"
select="tokenize($alternates, '\s+')"/>
<xsl:variable name="length"
select="min((count($prestrings),
count($poststrings)))"/>
<xsl:variable name="newtext"
select="
if ($length > 1)
then
my:translate($text,
string-join($prestrings[position() = (2 to $length)], ' '),
string-join($poststrings[position() = (2 to $length)], ' '))
else
$text"/>
<xsl:sequence select="replace($newtext,
$prestrings[1],
$poststrings[1])"/>
</xsl:function>
<xsl:template match="/">
<test>
<xsl:value-of select="my:translate($text,
'ä ö ü Ä Ö Ü ß é',
'ae oe ue Ae Oe Ue ss e')"/>
</test>
</xsl:template>
</xsl:stylesheet>
Funktioniert in Saxon. Etwas umständlich, ja, insbesondere das Tokenisieren und Zusammenfriemeln, aber mir macht es mehr Spaß als Deine Lösung, Thomas. ;)
(Und ausserdem war ich vorhin nur hier gelandet um kundzutun, dass man sicherlicher im Notfall eine sehr quicke und sehr dirrrrty Lösung mit xsl:character-map/ machen könnte, vorausgesetzt das Ziel-Markup käme einem nicht in die Quere. Aber nicht sehr empfehlenswert.)
Tim