juls_pro_37: XSLT String von links auffüllen

Hi,

bitte um Hilfe. 😀

Wie kann ich für einen Knoten im XML mittels XSLT festlegen, dass ein bestimmter Wert 14 stellig sein muss und falls nicht von links mit 0 aufgefüllt wird?

Benötigt ihr hierfür mein XML?

Beispiel: 1234567890123 soll 14stellig werden mit führender 0 -> 01234567890123 123456 -> 00000000123456

Danke 😀

LG Julian

akzeptierte Antworten

  1. Hi,

    Wie kann ich für einen Knoten im XML mittels XSLT festlegen, dass ein bestimmter Wert 14 stellig sein muss und falls nicht von links mit 0 aufgefüllt wird?

    Benötigt ihr hierfür mein XML?

    Beispiel: 1234567890123 soll 14stellig werden mit führender 0 -> 01234567890123 123456 -> 00000000123456

    als ich noch XSLT gemacht hab (1.0er Zeiten), ging das im Prinzip so: String mit 14 Nullen nehmen, den eigentlichen Wert dranhängen, dann substring(länge des Strings - 14, länge des strings).

    Die genaue Syntax bring ich nicht mehr zusammen …

    In XSLT 2.0 mag's bessere Methoden geben.

    cu,
    Andreas a/k/a MudGuard

    1. Hallo Andreas,

      als ich noch XSLT gemacht hab (1.0er Zeiten), ging das im Prinzip so: String mit 14 Nullen nehmen, den eigentlichen Wert dranhängen, dann substring(länge des Strings - 14, länge des strings).

      Die genaue Syntax bring ich nicht mehr zusammen …

      <xsl:variable name="str" select="'123456'"/>
      
      <xsl:value-of select="concat(substring('00000000000000', 1, 14 - string-length($str)), $str)"/>
      

      In XSLT 2.0 mag's bessere Methoden geben.

      <xsl:value-of select="concat(string-join(for $i in (1 to 14 - string-length($str)) return '0', ''), $str)"/>
      

      Ergebnis jeweils 00000000123456.

      @Julian: $str entspricht dem XML-Knotennamen.

      Grüße,
      Thomas

      1. <xsl:variable name="str" select="'123456'"/>

        wow danke für die schnellen antworten an euch beide 😀

        blöde frage, aber muss ich unter xslt 1.0 immer die betroffene zahl kennen bzw. im xslt pflegen? wie oben beschrieben: select = 123456

        Habe in meinem Fall den Knoten <GTINNumber>12345678</GTINNumber> unter <LineItem> und der Inhalt der GTINNumber variiert immer. (Erhalt einer Bestellung). Wenn ich da jeden GTIN einzeln ins XSLT eintragen muss, werd ich "alt" 😀 -> Hintergrund: Kunde bestellt etwas mit einer 13stelligen Nr, aber mein System erkennt sie nur 14stellig.

        lg Julian

        1. Hallo Julian,

          Habe in meinem Fall den Knoten <GTINNumber>12345678</GTINNumber> unter <LineItem> und der Inhalt der GTINNumber variiert immer. (Erhalt einer Bestellung). Wenn ich da jeden GTIN einzeln ins XSLT eintragen muss, werd ich "alt" 😀

          Ich habe ja extra darauf verwiesen, dass statt dem festen String der jeweilige XML-Knoten zu verwenden ist, kann auch über die genannte Variable geregelt werden:

          <xsl:variable name="str" select="LineItem/GTINNumber"/>
          

          oder auch nur select="GTINNumber" in Abhängigkeit von der Position innerhalb der Transformation.

          Ohne elementare Grundlagen kommst Du aber nur schleppend voran. Wenn XSLT 1.0 das Mittel der Wahl ist, dann könnte dieses relativ neue Buch nützlich sein. Das Wiki hilft ebenfalls.

          Grüße,
          Thomas

          1. Hi Thomas,

            danke für die Empfehlung, werde mich die Tage mehr ins Thema XSLT einlesen. (ist noch komplettes Neuland...)

            Leider bring ich das nicht ganz zusammen, hier mein XML:

            <?xml version="1.0" encoding="UTF-8"?>
            <SALESORDER>
              <Interchange>
                <InterchangeReference></InterchangeReference>
                <Test></Test>     
                 <CreationDateTime></CreationDateTime>	 
                 <MessageReference></MessageReference>
                 <Recipient></Recipient>
                 <Sender></Sender>
                <HeaderInformation>
                  <DeliveryDate></DeliveryDate>      
                  <CustomerOrderReference></CustomerOrderReference>      
                  <HeaderText>
                   <Qualifier></Qualifier>
                   <Text></Text>
                  </HeaderText>
                  <HeaderText>
                   <Qualifier></Qualifier>
                   <Text></Text>
                  </HeaderText>
                 <DeliveryAddressInformation>
                  <GLN></GLN>      
                 </DeliveryAddressInformation>
                 <BuyerAddressInformation>
                  <GLN></GLN>      
                 </BuyerAddressInformation>						   
                 <InvoiceAddressInformation>
                  <GLN></GLN>
                 </InvoiceAddressInformation>
                 <LineItem>
                  <Line>1</Line>
                  <GTIN>1256910</GTIN>     
                  <RequestedQuantity></RequestedQuantity>
                  <BuyerArticleNumber></BuyerArticleNumber>
                  <LineText>
                   <Qualifier></Qualifier>
                   <Text></Text>
                  </LineText>
                  <LineText>
                   <Qualifier></Qualifier>
                   <Text></Text>
                  </LineText>
                  <Unit></Unit>
                 </LineItem>
                 <LineItem>
                  <Line>2</Line>
                  <GTIN>611150508</GTIN>      
                  <RequestedQuantity></RequestedQuantity>
                  <BuyerArticleNumber></BuyerArticleNumber>
                  <LineText>
                   <Qualifier></Qualifier>
                   <Text></Text>
                  </LineText>
                  <LineText>
                   <Qualifier></Qualifier>
                   <Text></Text>
                  </LineText>
                  <Unit></Unit>
                 </LineItem>
                </HeaderInformation>
              </Interchange>
            </SALESORDER>
            

            Anbei mein XSLT:

            <?xml version="1.0" encoding="utf-8"?>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
                <xsl:output method="xml" indent="yes"/>
            	
                <xsl:template match="@* | node()">
                    <xsl:copy>
                        <xsl:apply-templates select="@* | node()"/>
                    </xsl:copy>
                </xsl:template> 
            	
            	<xsl:template match="LineItem/GTIN">
                <xsl:copy>
            		<xsl:variable name="LineItem" select="'GTIN'"/>
            		<xsl:value-of select="concat(substring('00000000000000', 1, 14 - string-length($LineItem)), $LineItem)"/>
            	</xsl:copy>
              </xsl:template>
              
            </xsl:stylesheet>
            

            lg Julian

            1. Hallo Julian,

              Anbei mein XSLT:

              <?xml version="1.0" encoding="utf-8"?>
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
                  <xsl:output method="xml" indent="yes"/>
              	
                  <xsl:template match="@* | node()">
                      <xsl:copy>
                          <xsl:apply-templates select="@* | node()"/>
                      </xsl:copy>
                  </xsl:template> 
              	
              	<xsl:template match="LineItem/GTIN">
                  <xsl:copy>
              		<xsl:variable name="LineItem" select="'GTIN'"/>
              		<xsl:value-of select="concat(substring('00000000000000', 1, 14 - string-length($LineItem)), $LineItem)"/>
              	</xsl:copy>
                </xsl:template>
                
              </xsl:stylesheet>
              

              Im gezeigten Code wählt select="'GTIN'" den String in den einfachen Anführungszeichen selbst. Direkt am gesuchten Element benötigt man den Kontextknoten, mit . abgekürzt [alternativ text()].

              <xsl:template match="LineItem/GTIN">
                <xsl:copy>
                  <xsl:variable name="LineItem" select="."/>
                  <xsl:value-of select="concat(substring('00000000000000', 1, 14 - string-length($LineItem)), $LineItem)"/>
                </xsl:copy>
              </xsl:template>
              

              Es geht kompakt auch ohne Variable und direkt über das Element GTIN:

              <xsl:template match="GTIN">
                <xsl:copy>
                  <xsl:value-of select="concat(substring('00000000000000', 1, 14 - string-length(.)), .)"/>
                </xsl:copy>
              </xsl:template>
              
              

              Grüße,
              Thomas

              1. hat wunderbar geklapt!! DANKE VIELMALS!! :) :)