Mahus: String in einer Schleife "analysieren"

Hallo,

folgendes beispiel:

Ich hab ein String der wie folgt aussehen kann:

xx|xxx|x
xxx|xxxxx|xxxx|xxxx
xxxxxx|xxxx
xx|xxxxxx|xxxx...

usw.

Ich suche jetzt nach einer Lösung, dass ich von dem String immer nur den letzten Teil bekomme.

Bsp.:

xx|xxxx|xxx

hier würde ich jetzt gerne nur "xxx" bekommen.

Danke
Mahus

  1. Hallo,

    xx|xxxx|xxx

    hier würde ich jetzt gerne nur "xxx" bekommen.

    Ist dein Trenner immer | ?

    Grüße
    Siri

    1. Ist dein Trenner immer | ?

      Ja ist er.

      Mahus

      1. Hallo,

        dann löse es über einen rekursiven Aufruf. Verkürze mit substring immer um ein Zeichen von vorne und zwar solang, bis kein | mehr enthalten ist (contains). Das muss dann der letzte Teilstring sein.

        Grüße
        Siri

        1. Hallo,

          dann löse es über einen rekursiven Aufruf. Verkürze mit substring immer um ein Zeichen von vorne und zwar solang, bis kein | mehr enthalten ist (contains). Das muss dann der letzte Teilstring sein.

          Grüße
          Siri

          Das war auch meine Idee, aber ich bekomme dann ein Stack Overflow.
          Hier mein Code, vielleicht ist da auch ein fehler.

          <xsl:template name="user:breadCrumbDesignation">  
          		<xsl:param name="string" select="()"/>  
          		<xsl:variable name="var1_resultof_substring_after" as="xs:string" select="fn:substring-after($string, '¦')"/>  
          		<xsl:call-template name="user:breadCrumbDesignation">  
          			<xsl:with-param name="string" as="xs:string">  
          				<xsl:choose>  
          					<xsl:when test="($var1_resultof_substring_after = '')">  
          						<xsl:sequence select="$string"/>  
          					</xsl:when>  
          					<xsl:otherwise>  
          						<xsl:sequence select="$var1_resultof_substring_after"/>  
          					</xsl:otherwise>  
          				</xsl:choose>  
          			</xsl:with-param>  
          		</xsl:call-template>  
          	</xsl:template>
          
          										~~~xml
          

          <xsl:variable name="var48_resultof_breadCrumbDesignation" as="xs:string?">
          <xsl:call-template name="user:breadCrumbDesignation">
          <xsl:with-param name="string" select="fn:substring($var47_resultof_substring_after, xs:double('0'), xs:double((fn:string-length($var47_resultof_substring_after) div xs:integer('2'))))" as="xs:string"/>
          </xsl:call-template>
          </xsl:variable>

            
            
            
          												~~~xml
            
          													<xsl:if test="fn:exists($var48_resultof_breadCrumbDesignation)">  
          														<designation>  
          															<xsl:sequence select="$var48_resultof_breadCrumbDesignation"/>  
          														</designation>  
          													</xsl:if>  
          												
          
          1. Hallo,

            hab jetzt leider nicht die Zeit das zu analysieren... Aber auf den ersten Blick: Warum das Template aufrufen, wenn die Abbruchbedingung erreicht ist? Warum nicht innerhalb von when und eine Ausgabe bei otherwise? Das scheint mir eine Endloschleife.

            Grüße
            Siri

            1. Hallo,

              hab jetzt leider nicht die Zeit das zu analysieren... Aber auf den ersten Blick: Warum das Template aufrufen, wenn die Abbruchbedingung erreicht ist? Warum nicht innerhalb von when und eine Ausgabe bei otherwise? Das scheint mir eine Endloschleife.

              Grüße
              Siri

              Ich hab das größten Teils mit Altova Map Force erstellt. So bekam ich das Template. Ja es ist auch so eine Endlosschleife.

              Versteh ich jetzt nicht wie du das meinst mit innerhalb von When.

              Wenn ich das so dahin baue bekomme ich Stylesheet Fehler, obwohl das für mich sinn ergibt so wenn Bedingung erfüllt OK otherwise ruf wieder template auf.

              		~~~xml
              

              <xsl:with-param name="string" as="xs:string">
              xsl:choose
              <xsl:when test="($var1_resultof_substring_after = '')">
              <xsl:sequence select="$string"/>
              </xsl:when>
              xsl:otherwise
              <xsl:call-template name="user:breadCrumbDesignation">
              <xsl:sequence select="$var1_resultof_substring_after"/>
              </xsl:call-template>
              </xsl:otherwise>
              </xsl:choose>
              </xsl:with-param>

                
                
                
                
                
              
              
              1. Hab es hinbekommen danke.

                1. Hab es hinbekommen danke.

                  Fürs Archiv: wie?

                  Gruß
                  Kalk

                  1. Hab es hinbekommen danke.

                    Fürs Archiv: wie?

                    Gruß
                    Kalk

                    Hallo,
                    sry für die späte Antwort.

                    Lösung reich ich bis Montag nach.

                    Gruß Mahus

  2. Hallo Mahus,

    Ich suche jetzt nach einer Lösung, dass ich von dem String immer nur den letzten Teil bekomme.

    Bsp.:

    xx|xxxx|xxx

    hier würde ich jetzt gerne nur "xxx" bekommen.

    Wenn XSLT/XPath ab 2.0 verfügbar ist (z. B. Saxon 9.x), dann kompakt so:

    <xsl:value-of select="fn:tokenize(xx|xxxx|xxx','\|')[fn:last()]"/>

    Grüße,
    Thomas

    1. Nachtrag, weil ein ' vergessen:

      <xsl:value-of select="fn:tokenize(xx|xxxx|xxx','\|')[fn:last()]"/>

      <xsl:value-of select="fn:tokenize('xx|xxxx|xxx','\|')[fn:last()]"/>

      Grüße,
      Thomas