Thomas J.S.: EXSLT

Beitrag lesen

Hallo,

Ich kann sie aber erst mit dem Filter rausnehmen, da ich ohne Java arbeite.

OK.

Ich verstehe jetzt so nicht ganz, warum du es noch immer auf diese Weise versucht. Es sei denn dein XML ist wirklich unbrauchbar: d.h. du hast in der Tat "Â " da drinn stehen (auch in einem UTF fähigen Editor).

Ja, meine XML enthalten diese Zeichen anstelle der Leerzeichen (es gab vorher Formatierungsfehler beim Erstellen der XMLFiles, [...]).

Au weia!

Überall im Text wo sie auftauchen sollen sie ersetzt werden, aber die restliche Struktur des XML's erhalten bleiben.

Dann kannst du das natürlich so ersetzen:
<xsl:when test=".//text()[contains(.,'Â ')]">
<xsl:value-of select="translate(.//text(), 'Â', '')"/>

Ich hab's so probiert:

<xsl:template match="*[xhtml:div]">
  xsl:copy
   <xsl:if test="//text()[contains(.,'Â ')]">
    <xsl:value-of select="translate(., '&#xA0;', ' ')"/>
    </xsl:if>
  </xsl:copy>
</xsl:template>

das hat meinen Text zwar bearbeitet aber die restliche Struktur rausgehauen.

Dann gucken wir doch an was es macht:

Vorher hattest du: <xsl:template match="xhtml:div">, jetzt hast du
<xsl:template match="*[xhtml:div]">
sprich: Template für jedes Element das ein xhtml:div als Kind hat. Kein Wunder dass dann die Struktur nicht erhalten bleibt.
Dann nimmst du "<xsl:if test="//text() ...">" mit //text() greifst du auf den  gesamten Text im ganzen Dokument . Die is-Abfrage sagt folgendes: "wenn _irgendwo_ im Text des Dokuments ein "Â " vokommt, ersetzen _im aktuellen_ Element "&#xA0;" duch " ". Das ist sicherlich nicht das was du willst.

OK, machen wir es so einfach wie möglich:

<xsl:template match="text()">
 <xsl:value-of select="translate(., 'Â ', ' ')"/>
<-- oder
    <xsl:value-of select="normalize-space(translate(., 'Â ', ' '))"/> -->
</xsl:template>

Mit diesem Template überprüfst du jeden Text im Dokument automatisch.
Danach muss du nur darauf achten, dass du dort wo du Text ausgeben willst _nicht mehr_ value-of, sondern apply-templates verwendest.

<xsl:template match="xhtml:div">
  xsl:copy
   <xsl:apply-templates />
  </xsl:copy>
 </xsl:template>

Grüße
Thomas