juls_pro_37: XSLT 1.0 substring-after

Hallo,

bitte um Hilfe. Ich benötige nur den Output nach dem zweiten "/".

-> Betrifft das Segment "OrderResponseReference"

Beispiel:

<?xml version="1.0" encoding="utf-8"?>
<OSTRPT>
  <Interchange>
    <Interchange_Control_Number>5637949159</Interchange_Control_Number>
  </Interchange>
  <HeaderInformation>
    <AcknowledgeId>1234</AcknowledgeId>
	<OrderResponseReference>1234567/33731/23409743</OrderResponseReference>    
    <BuyerAddressInformation>
      <GLN>123213214</GLN>
      <Identifier>9</Identifier>
    </BuyerAddressInformation>    
  </HeaderInformation>
  <LineInformation>
    <Item>
      <LineNum>10</LineNum>      
    </Item>
  </LineInformation>
</OSTRPT>

Korrekt sollte es so aussehen:

<?xml version="1.0" encoding="utf-8"?>
<OSTRPT>
  <Interchange>
    <Interchange_Control_Number>5637949159</Interchange_Control_Number>
  </Interchange>
  <HeaderInformation>
    <AcknowledgeId>1234</AcknowledgeId>
	<OrderResponseReference>23409743</OrderResponseReference>    
    <BuyerAddressInformation>
      <GLN>123213214</GLN>
      <Identifier>9</Identifier>
    </BuyerAddressInformation>    
  </HeaderInformation>
  <LineInformation>
    <Item>
      <LineNum>10</LineNum>      
    </Item>
  </LineInformation>
</OSTRPT>

Aktueller Code:

  <xsl:template match="OrderResponseReference[contains(., '/')]">
    <OrderResponseReference><xsl:value-of select="substring-after(., '/')"/></OrderResponseReference>
  </xsl:template>

Danke & LG Julian

akzeptierte Antworten

  1. Hallo Julian,

    bitte um Hilfe. Ich benötige nur den Output nach dem zweiten "/".

    -> Betrifft das Segment "OrderResponseReference"

    Sofern das Trennzeichen nur 2x vorkommt, reicht das:

    <xsl:value-of select="substring-after(substring-after(., '/'), '/')"/>
    

    Mal wieder ein guter Punkt, warum man XSLT 2.0/3.0 haben möchte. Dort bringt es:

    <xsl:value-of select="tokenize(., '/')[last()]"/>
    

    Ist die Anzahl nicht bekannt, müsste man für XSLT 1.0 ein rekursives Template bauen und die Teilstrings nacheinander durchgehen.

    Grüße,
    Thomas

    1. danke dir. bis Dato hatte ich nur den Fall, dass '/' höchstens zwei mal vorkommt. (Hoffe, das bleibt auch so)

      Wie gehe ich nur vor, wenn der Wert unter "OrderResponseReference" entweder "1234/5678" oder "1234/5678/90123" sein kann. -> Sprich es kann sein, dass das '/' manchmal 1x und manchmal 2. vorkommt.

      Hätte an "if" und "count" gedacht oder denke ich etwas zu kompliziert?:

          <xsl:template match="/">
          <xsl:copy>    
            <xsl:apply-templates select="@* | node()"/>   
          <!-- check, if '/' is duplicated -->
           <xsl:for-each select="OrderResponseReference[contains(., '/')]">
                  <xsl:if test="count(., '/') > 1">
      				<OrderResponseReference><xsl:value-of select="substring-after(., '/')"/></OrderResponseReference>
                  </xsl:if>
      			<xsl:if test="count('/') = 1">
      				<xsl:value-of select="substring-after(substring-after(., '/'), '/')"/>
                  </xsl:if>
              </xsl:for-each>   
          </xsl:copy>
        </xsl:template>
      
      1. Hallo Julian,

        Wie gehe ich nur vor, wenn der Wert unter "OrderResponseReference" entweder "1234/5678" oder "1234/5678/90123" sein kann. -> Sprich es kann sein, dass das '/' manchmal 1x und manchmal 2. vorkommt.

        Ok, dann direkt mit xsl:call-template.

        <!-- Einstieg mit dem Wert bei string: -->
        <xsl:call-template name="last-substring-after">
          <xsl:with-param name="search" select="'/'"/>
          <xsl:with-param name="string" select="."/>
        </xsl:call-template>
        
        <!-- das aufzurufende Template: -->
        <xsl:template name="last-substring-after">
          <xsl:param name="search"/>
          <xsl:param name="string"/>
          <xsl:variable name="result" select="substring-after($string, $search)"/>
          <xsl:choose>
            <xsl:when test="contains($result, $search)">
              <xsl:call-template name="last-substring-after">
                <xsl:with-param name="search" select="$search"/>
                <xsl:with-param name="string" select="$result"/>
              </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="$result"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:template>
        

        Grüße,
        Thomas

        1. DANKE DANKE DANK!!!! wieder mal unglaubliche Leistung!!!