Hallo,
also ich habe einen sehr langen Satz mit Zeichen und möchte jedes 77ste Zeichen ersetzen oder den Satz Zeichen in Blöcke mir je 77 Zeichen zerlegen.
Wie ist das den möglich.
Ersetzen oder zerlegen sind zwei verschiedene Dinge.
Also mit einer if oder when abfrage würde ja folgendes gehen:
<xsl:if test="$counter div 77 = >
Dann müßten ja immer ganze Zahlen rauskommen.
Wer sagt das? Abgesehen davon dass nach dem = eine Zahl fehlt, ist es die Frage was genau counter ist? Auch eine Zahl? Oder enthält das den Text?
Ich weiß aber nicht wie man das umsetzten kann!
Also mit einem Zeichen ersetzen:
<xsl:template name="replace">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="with"/>
<xsl:param name="position"/>
xsl:choose
<xsl:when test="contains(substring($text, $position, 1), $replace) and ($replace != '')">
<xsl:value-of select="substring($text, 1, $position - 1)"/>
<xsl:value-of select="$with"/>
<xsl:call-template name="replace">
<xsl:with-param name="text" select="substring($text, $position + 1)"/>
<xsl:with-param name="replace" select="substring($text, ($position * 2), 1)"/>
<xsl:with-param name="with" select="$with"/>
<xsl:with-param name="position" select="$position"/>
</xsl:call-template>
</xsl:when>
xsl:otherwise
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Aufruf z.B. :
<xsl:template match="satz">
<xsl:call-template name="replace">
<xsl:with-param name="text" select="normalize-space(.)"/>
<xsl:with-param name="replace" select="substring(normalize-space(.), 77, 1)"/>
<xsl:with-param name="with" select="'#'"/>
<xsl:with-param name="position" select="77"/>
</xsl:call-template>
</xsl:template>
Hier wird also jede 77. Zeichen (egal welches das jeweils ist) durch das Zeichen: # ersetzt. Das normalize-space(.) im ersten aufruf ist wichtig (kann wichtig sein), falls z.B. das erste Zeichen ein Zeilenumbruch ist (oder mehrere Lerzeichen aufeinander folgen etc.):
<satz>
Hier beginnts ...
Bei einer geringer Abwandlung dieses Templates kannst du den Satz auch zerlegen:
<xsl:template name="replace">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="position"/>
xsl:choose
<xsl:when test="contains(substring($text, $position, 1), $replace) and ($replace != '')">
<p><xsl:value-of select="substring($text, 1, $position - 1)"/></p>
<xsl:call-template name="replace">
<xsl:with-param name="text" select="substring($text, $position + 1)"/>
<xsl:with-param name="replace" select="substring($text, ($position * 2), 1)"/>
<xsl:with-param name="position" select="$position"/>
</xsl:call-template>
</xsl:when>
xsl:otherwise
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Dann den Aufruf entsprechend gestalten.
Mit weiteren Abwandlungen des Templates kannst du auch ganze Zeichenketten durch andere ersetzen.
Grüße
Thomas