Announcement

Collapse
No announcement yet.

Durch Sequenz iterieren...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Durch Sequenz iterieren...

    Verzweifle gerade an einem Problem, was für Euch sicher einfach zu lösen ist.

    Gegeben sei diese XML:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="TestCard.xsl"?>
    <SEQUENCE>                      
        <BARCODE_SEQUENCE>
        	<BARCODE>1082287001017</BARCODE>
        	<BARCODE>1082287001027</BARCODE>
        	<BARCODE>1082287001037</BARCODE>
        	<BARCODE>1082287001047</BARCODE>
        	<BARCODE>1082287001057</BARCODE>
        </BARCODE_SEQUENCE>
    </SEQUENCE>
    die mit dieser XSL

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
       <xsl:template match="SEQUENCE">
          <html>
             <body>
                  <xsl:for-each select="BARCODE_SEQUENCE">
                  		<xsl:value-of select="."/>
                  		<br />
                  		Here we go
                  </xsl:for-each>
             </body>
          </html>
       </xsl:template>
    </xsl:stylesheet>
    transformiert werden soll. Die Ausgabe sieht im Moment so aus:

    1082287001017 1082287001027 1082287001037 1082287001047 1082287001057
    Here we go
    Möchte aber das die for-each Schleife das produziert:

    1082287001017
    Here we go
    1082287001027
    Here we go
    1082287001037
    Here we go
    1082287001047
    Here we go
    1082287001057
    Here we go
    Sich also verhält, wie man das von einer normalen Programmeirsprache erwarten würde.

    Die obige Aufgabe ist der einfachheit halber verkürzt. Es soll eigentlich ein Template mit weiteren Werten aufgerufen werden, dass einen Barcode mit weiterem Zahlenwerk generiert und das n mal, für jeden gefundenen Barcode in der Sequenz. Das ganze soll im IE laufen.


    Kann mir einer sagen, wie ich das umbauen muss, damit das geht?
    Zuletzt editiert von louk; 05.09.2008, 11:20.

  • #2
    Da es um alle BARCODE-Elemente geht:
    Code:
    <xsl:for-each select="BARCODE_SEQUENCE/BARCODE">...</xsl:for-each>

    Comment


    • #3
      So ähnlich hatte ich es schon aber jetzt weiss ich was gefehlt hat (CUSTOM: vor BARCODE). Vielen Dank.

      Allerdings habe ich noch ein Problem. Der eigentliche Code sieht so aus:

      Code:
      <xsl:for-each select="CUSTOM:BARCODE_ARRAY/CUSTOM:BARCODE">   
      	<xsl:call-template name="ticket">
      		<xsl:with-param name="color"      	select="CUSTOM:COLOR" 	   />
      		<xsl:with-param name="pattern_no" 	select="CUSTOM:PATTERN_NO" />
      		<xsl:with-param name="size" 	   	select="CUSTOM:SIZE"	   />
      		<xsl:with-param name="ticket_no"  	select="CUSTOM:TICKET_NO"  />
      		<xsl:with-param name="title" 	   	select="CUSTOM:TITLE" 	   />
      		<xsl:with-param name="color_id"   	select="CUSTOM:COLOR_ID"   />
      		<xsl:with-param name="barcode" 		select="."   		   />
      		<xsl:with-param name="batch_id" 	select="CUSTOM:BATCH_ID"   />
      	</xsl:call-template> 
      	<br />
      </xsl:for-each>
      Beim Template kommt aber nur der Barcode an, die anderen Werte werden nicht übergeben. Wieso nicht?

      Comment


      • #4
        Das lässt sich ohne genauere Codekenntnis (XML/XSLT) nicht beurteilen. Wie sieht das ticket-Template aus? Wo stehen diese CUSTOM:Elemente?
        Zuletzt editiert von Thomas Meinike; 05.09.2008, 12:20.

        Comment


        • #5
          Muss was damit zutun haben, dass durch das for-each im Baum weiter runter verzweigt wird vermute ich mal.

          wenn ich
          Code:
          <xsl:variable name="patno"><xsl:value-of select="CUSTOM:PATTERN_NO"/></xsl:variable> lade und dann 
          
          <xsl:for-each select="CUSTOM:BARCODE_ARRAY/CUSTOM:BARCODE">   
          	<xsl:call-template name="ticket">
          		<xsl:with-param name="color"      	select="CUSTOM:COLOR" 	   />
          		<xsl:with-param name="pattern_no" 	select="$patno" />
          		<xsl:with-param name="size" 	    select="CUSTOM:SIZE"	   />							  
          ...
          
          so aufrufe,
          wird die Pattern No übergeben.

          COLOR, SIZE usw. befinden sich auf selber Ebene wie BARCODE_ARRAY.

          Reicht das als Info?

          Comment


          • #6
            Dann gehe ausgehend von CUSTOM:BARCODE wieder eine Ebene höher, also select="../CUSTOM:COLOR" usw.

            Comment


            • #7
              Mit ../../ ging es dann. Spitze. Verneige mich ehrfurchtsvoll.

              Jetzt wäre es noch ganz praktisch, wenn man die Anzahl der BARCODE Einträge ermitteln könnte . Gibt es dafür eine Standardpropertie dieses objektes? Für Stringlängen gibt es sowas aber hier?

              Comment


              • #8
                Dazu dient die XPath-Funktion count(knotenmenge).

                Comment


                • #9
                  Jo, hat geklappt und das Wochenende ist gerettet. Den Rest der noch nötig war, habe ich auch hinbekommen. Wahrscheinlich geht das aber noch eleganter.

                  Der letzte Barcodewert soll eine etwas andere Ausgabe produzieren. Sieht jetzt so aus:

                  Code:
                  <!-- caption "cannot be linked" -->
                  <xsl:variable name="cant_be_linked">Cant be linked</xsl:variable>
                  <!-- determine ticket number -->
                  <xsl:variable name="ticket_num" as="xs:string"><xsl:value-of select="substring(CUSTOM:BAR_CODE,8,3)" /></xsl:variable>                                                  
                  <xsl:variable name="NumOfParts"><xsl:value-of select="count(CUSTOM:BARCODE_ARRAY/CUSTOM:BARCODE)"/></xsl:variable>
                  
                  <xsl:for-each select="CUSTOM:BARCODE_ARRAY/CUSTOM:BARCODE">   
                     <!-- Normal Ticket-->
                     <xsl:if test="$NumOfParts - position()>0">                                  
                  	   <xsl:call-template name="ticket">
                  		  <xsl:with-param name="color"      	select="../../CUSTOM:COLOR" 	 />
                  		  <xsl:with-param name="pattern_no" 	select="../../CUSTOM:PATTERN_NO" />
                  		  <xsl:with-param name="size" 	    	select="../../CUSTOM:SIZE"	     />
                  		  <xsl:with-param name="ticket_no"  	select="$ticket_num"  			 />
                  		  <xsl:with-param name="title" 	    	select="../../CUSTOM:TITLE" 	 />
                  		  <xsl:with-param name="color_id"   	select="../../CUSTOM:COLOR_ID"   />
                  		  <xsl:with-param name="barcode" 	select="."   			   		 />
                  		  <xsl:with-param name="batch_id" 	select="../../CUSTOM:BATCH_ID"   />								  
                  	   </xsl:call-template> 
                     </xsl:if>
                     <!-- Master Ticket-->
                     <xsl:if test="$NumOfParts - position()=0">                                  
                  	   <xsl:call-template name="ticket">
                  		  <xsl:with-param name="color"      	select="../../CUSTOM:COLOR" 	 />
                  		  <xsl:with-param name="pattern_no" 	select="../../CUSTOM:PATTERN_NO" />
                  		  <xsl:with-param name="size" 	    	select="../../CUSTOM:SIZE"	     />
                  		  <xsl:with-param name="ticket_no"  	select="$ticket_num"  			 />
                  		  <xsl:with-param name="title" 	    	select="../../CUSTOM:TITLE" 	 />
                  		  <xsl:with-param name="color_id"   	select="../../CUSTOM:COLOR_ID"   />
                  		  <xsl:with-param name="barcode" 	select="."   			   		 />
                  		  <xsl:with-param name="batch_id" 	select="../../CUSTOM:BATCH_ID"   />								  
                  		  <xsl:with-param name="cant_b_lnk" 	select="$cant_be_linked"   />  
                  		  <xsl:with-param name="num_of_parts" 	select="$NumOfParts -1" />                                                                    
                  	   </xsl:call-template> 
                     </xsl:if>
                  
                    <br />
                  </xsl:for-each>
                  Schöner wäre es wenn man im Template wenns nötig ist, die zwei Parameter erweitern könnte für das letzte Ticket.

                  Code:
                  <!-- caption "cannot be linked" -->
                  <xsl:variable name="cant_be_linked">Cant be linked</xsl:variable>
                  <!-- determine ticket number -->
                  <xsl:variable name="ticket_num" as="xs:string"><xsl:value-of select="substring(CUSTOM:BAR_CODE,8,3)" /></xsl:variable>                                                  
                  <xsl:variable name="NumOfParts"><xsl:value-of select="count(CUSTOM:BARCODE_ARRAY/CUSTOM:BARCODE)"/></xsl:variable>
                  
                  <xsl:for-each select="CUSTOM:BARCODE_ARRAY/CUSTOM:BARCODE">   
                     <xsl:call-template name="ticket">
                  	  <xsl:with-param name="color"      	select="../../CUSTOM:COLOR" 	 />
                  	  <xsl:with-param name="pattern_no" 	select="../../CUSTOM:PATTERN_NO" />
                  	  <xsl:with-param name="size" 	    	select="../../CUSTOM:SIZE"	     />
                  	  <xsl:with-param name="ticket_no"  	select="$ticket_num"  			 />
                  	  <xsl:with-param name="title" 	    	select="../../CUSTOM:TITLE" 	 />
                  	  <xsl:with-param name="color_id"   	select="../../CUSTOM:COLOR_ID"   />
                  	  <xsl:with-param name="barcode" 	select="."   			   		 />
                  	  <xsl:with-param name="batch_id" 	select="../../CUSTOM:BATCH_ID"   />								  
                  	  <xsl:if test="$NumOfParts - position()=0">
                  		  <!-- Master Ticket Zusatz -->
                  		  <xsl:with-param name="cant_b_lnk" 	select="$cant_be_linked"   />  
                  		  <xsl:with-param name="num_of_parts" 	select="$NumOfParts -1" />                                                                    
                  	   </xsl:if>
                     </xsl:call-template> 
                    <br />
                  </xsl:for-each>
                  Aber da hat Cooktop gemosert, dass innerhalb des Templates kein if möglich wäre.

                  Comment


                  • #10
                    xsl:if ist an dieser Stelle nicht möglich, aber die Parameter können ja dennoch belegt und dann im aufgerufenen Template geprüft werden.
                    BTW: xsl:variable lässt sich auch einfacher belegen:
                    Code:
                    <xsl:variable name="NumOfParts" select="count(CUSTOM:BARCODE_ARRAY/CUSTOM:BARCODE)"/>
                    Zuletzt editiert von Thomas Meinike; 05.09.2008, 17:24.

                    Comment


                    • #11
                      Ok, vielen Dank für die Hinweise und Unterstützung. Werde die Tipps einbauen.

                      Schönes Wochenende.

                      Comment

                      Working...
                      X