Martin K.: Bedingte Bedingungen, nur jedes x-te Zeichen

Hallo,

Wie kann ich es hinbekommen, das jedes 77 Zeichen ignoriert wird?
Also wenn ich das so habe:

<xsl:if test="$counter mod 77 != ">

Kann ich das so machen?
Bei mod muss dann ja eine ganze Zahl rauskommen.
Gibts sowas bei XSLT?

Danke

  1. Hallo,

    Wie kann ich es hinbekommen, das jedes 77 Zeichen ignoriert wird?
    Also wenn ich das so habe:

    das geht wahrscheinlich nur mit einem rekursiven Template.

    Benamtes Template mit dem String aufrufen
    Ist der String kürzer als 77 Zeichen?
    Ja: String ausgeben und fertig.
    Nein: Die ersten 76 Zeichen ausgeben und das Template mit einem neuen String (= alter String ab 78. Zeichen) wieder aufrufen.

    Gruß
    Olaf

  2. Hallo,

    Wie kann ich es hinbekommen, das jedes 77 Zeichen ignoriert wird?

    Das kommt darauf an, was du genau machen möchtest.

    Also wenn ich das so habe:
    <xsl:if test="$counter mod 77 != ">

    Dann funktioniert das nicht.

    Kann ich das so machen?

    So? Nein.

    Bei mod muss dann ja eine ganze Zahl rauskommen.
    Gibts sowas bei XSLT?

    Ja.
    Was genau möchtest du machen?

    Grüße
    Thomas

    1. 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.

      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.
      Ich weiß aber nicht wie man das umsetzten kann!

      Danke Martin

      1. 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