J32: ausgabe mit übereinstimmung und 3 spalten

Hallo,

ich beschäftige mich seit genau 2 Stunden mit xsl und versuche gerade ein template für eine xml datei zu schreiben.

Bisher sieht das XSL file so aus

  
   <table class="table">  
    <xsl:for-each select="heartsinlove/row[category = 1 and position() mod 3 = 1]">  
     <tr>  
     <xsl:for-each select=".|following-sibling::row[position() &lt; 3 ]">  
      <td class="td">  
       <xsl:element name="a">  
       <xsl:attribute name="href">  
       <xsl:value-of select="link"/>  
       </xsl:attribute>  
         <img>  
         <xsl:attribute name="src">  
          <xsl:value-of select="image_link"/>  
         </xsl:attribute>  
         <xsl:attribute name="alt">  
          <xsl:value-of select="title"/>  
         </xsl:attribute>  
         </img><br/>  
         <xsl:value-of select="title"/>  
       </xsl:element><br/>  
       <xsl:value-of select="price"/>  
      </td>  
     </xsl:for-each>  
     </tr>  
    </xsl:for-each>  
   </table>  

Mein Problem ist diese Zeile

">]

Sie sollte eigentlich bewirken das mir alles ausgegeben wird was category = 1 ist und soll mir 3 datensätze pro Tabellen Zeile ausgeben.

Beides einzeln arbeitet wunderbar. Aber zusammen funktioniert es nicht. Mir wird zwar alles in drei spalten ausgegeben, aber es sind eben auch sachen darunter die nicht unter die regel category = 1 fallen.

Wie erhalte ich das von mir gewünschte resultat?

danke

J32

  1. ...oh da ist mir ein Fehler in meinem Text unterlaufen. Hier der fehlende Teil

    Mein Problem ist diese Zeile

    <xsl:for-each select="heartsinlove/row[category = 1 and position() mod 3 = 1]">

  2. Hallo,

    ich beschäftige mich seit genau 2 Stunden mit xsl und versuche gerade ein template für eine xml datei zu schreiben.

    Bisher sieht das XSL file so aus

    ich mache das erstmal etwas übersichtlicher:

      
    <table class="table">  
        <xsl:for-each select="heartsinlove/row[category = 1 and position() mod 3 = 1]">  
         <tr>  
         <xsl:for-each select=".|following-sibling::row[position() &lt; 3 ]">  
          <td class="td">  
           <a href="{link}">  
             <img src="{image_link}" alt="{title}" /><br/>  
             <xsl:value-of select="title"/>  
           </a><br/>  
           <xsl:value-of select="price"/>  
          </td>  
         </xsl:for-each>  
         </tr>  
        </xsl:for-each>  
       </table>  
    
    

    Sie sollte eigentlich bewirken das mir alles ausgegeben wird was category = 1 ist und soll mir 3 datensätze pro Tabellen Zeile ausgeben.

    Beides einzeln arbeitet wunderbar. Aber zusammen funktioniert es nicht. Mir wird zwar alles in drei spalten ausgegeben, aber es sind eben auch sachen darunter die nicht unter die regel category = 1 fallen.

    Wie erhalte ich das von mir gewünschte resultat?

    Endere:
    <xsl:for-each select=".|following-sibling::row[position() &lt; 3 ]">
    zu:
    <xsl:for-each select=".|following-sibling::row[category = 1 and position() &lt; 3 ]">

    Ansonsten bitte XML zeigen.

    Grüße
    Thomas

    1. Endere:
      <xsl:for-each select=".|following-sibling::row[position() &lt; 3 ]">
      zu:
      <xsl:for-each select=".|following-sibling::row[category = 1 and position() &lt; 3 ]">

      Ansonsten bitte XML zeigen.

      Grüße
      Thomas

      »»
      Hallo Thomas,

      erstmal danke das du mir helfen möchtest. Deine Änderung hab ich gemacht und es hat ergeben das mir jetzt alle produkte der category=1 angezeigt werden in drei spalten je zeile. ABER darunter werden mir alle anderen produkte angezeigt in einer spalte pro zeile.

      hier ein link damit du es dir anschauen kannst klicke hier zum XML

      hier mein xml file (zu lang deshalb gekürzt)

        
      <?xml version="1.0" encoding="ISO-8859-1"?>  
      <?xml-stylesheet type="text/xsl" href="product.xsl"?>  
      <products>  
      <row>  
      <id>298914297</id>  
      <link>http://www.cafepress.com/gamecards.298914297</link>  
      <title>Don&apos;t hate the Player Women&apos;s Plus Size V-Neck T-S</title>  
      <description>A fun design for everybody who likes to play poker or other games. It shows the four aces with the text Dont hate the player hate the game.</description>  
      <image_link>http://images.cafepress.com/product/298914297_400x400_Front.jpg</image_link>  
      <price>27.99</price>  
      <currency>USD</currency>  
      <brand>gamecards</brand>  
      <condition>new</condition>  
      <product_type>Women&apos;s Plus Size V-Neck T-Shirt</product_type>  
      <category>1</category>  
      </row>  
      <row>  
      <id>298914298</id>  
      <link>http://www.cafepress.com/gamecards.298914298</link>  
      <title>Don&apos;t hate the Player Women&apos;s Plus Size V-Neck Dar</title>  
      <description>A fun design for everybody who likes to play poker or other games. It shows the four aces with the text Dont hate the player hate the game.</description>  
      <image_link>http://images.cafepress.com/product/298914298_400x400_Front.jpg</image_link>  
      <price>27.99</price>  
      <currency>USD</currency>  
      <brand>gamecards</brand>  
      <condition>new</condition>  
      <product_type>Women&apos;s Plus Size Dark V-Neck T-Shirt</product_type>  
      <category>1</category>  
      </row>  
      <row>  
      <id>298929958</id>  
      <link>http://www.cafepress.com/gamecards.298929958</link>  
      <title>Don&apos;t hate the Player Baseball Jersey</title>  
      <description>A fun design for everybody who likes to play poker or other games. It shows the four aces with the text Dont hate the player hate the game.</description>  
      <image_link>http://images.cafepress.com/product/298929958_400x400_Front.jpg</image_link>  
      <price>19.99</price>  
      <currency>USD</currency>  
      <brand>gamecards</brand>  
      <condition>new</condition>  
      <product_type>Baseball Jersey</product_type>  
      <category>2</category>  
      </row>  
      <row>  
      <id>299196643</id>  
      <link>http://www.cafepress.com/gamecards.299196643</link>  
      <title>Don&apos;t hate the Player Jr. Hoodie</title>  
      <description>A fun design for everybody who likes to play poker or other games. It shows the four aces with the text Dont hate the player hate the game.</description>  
      <image_link>http://images.cafepress.com/product/299196643_400x400_Front.jpg</image_link>  
      <price>27.99</price>  
      <currency>USD</currency>  
      <brand>gamecards</brand>  
      <condition>new</condition>  
      <product_type>Jr. Hoodie</product_type>  
      <category>2</category>  
      </row>  
      <row>  
      <id>298937918</id>  
      <link>http://www.cafepress.com/gamecards.298937918</link>  
      <title>Don&apos;t hate the Player Black Cap</title>  
      <description>A fun design for everybody who likes to play poker or other games. It shows the four aces with the text Dont hate the player hate the game.</description>  
      <image_link>http://images.cafepress.com/product/298937918_400x400_Front.jpg</image_link>  
      <price>19.99</price>  
      <currency>USD</currency>  
      <brand>gamecards</brand>  
      <condition>new</condition>  
      <product_type>Black Cap</product_type>  
      <category>4</category>  
      </row>  
      <row>  
      <id>299196642</id>  
      <link>http://www.cafepress.com/gamecards.299196642</link>  
      <title>Don&apos;t hate the Player Trucker Hat</title>  
      <description>A fun design for everybody who likes to play poker or other games. It shows the four aces with the text Dont hate the player hate the game.</description>  
      <image_link>http://images.cafepress.com/product/299196642_400x400_Front.jpg</image_link>  
      <price>14.99</price>  
      <currency>USD</currency>  
      <brand>gamecards</brand>  
      <condition>new</condition>  
      <product_type>Trucker Hat</product_type>  
      <category>4</category>  
      </row>  
      </products>  
        
      
      
      1. Hallo,

        Endere:
        <xsl:for-each select=".|following-sibling::row[position() &lt; 3 ]">
        zu:
        <xsl:for-each select=".|following-sibling::row[category = 1 and position() &lt; 3 ]">

        erstmal danke das du mir helfen möchtest. Deine Änderung hab ich gemacht und es hat ergeben das mir jetzt alle produkte der category=1 angezeigt werden in drei spalten je zeile. ABER darunter werden mir alle anderen produkte angezeigt in einer spalte pro zeile.

        Ich habe aber nicht gesagt, dass du category = 1 aus dem ersten for-each rausnehmen sollst! ;-)

        <xsl:for-each select=" products/row[category = 1 and position() mod 3 = 1]">  
              <tr>  
               <xsl:for-each select=".|following-sibling::row[category = 1 and position() &lt; 3 ]">  
                <td class="td">  
                 <a href="{link}">  
                  <img src="{image_link}" alt="{title}" /><br/>  
                  <xsl:value-of select="title"/>  
                 </a>  
                 <br/>  
                 <xsl:value-of select="price"/>  
                </td>  
               </xsl:for-each>  
              </tr>  
          
             </xsl:for-each>
        

        Grüße
        Thomas

        1. Ich habe aber nicht gesagt, dass du category = 1 aus dem ersten for-each rausnehmen sollst! ;-)

          tja da hast du recht das hast du nicht gesagt. Und nun klappts auch wunderbar...vielen dank :)

        2. Hallo,

          Endere:
          <xsl:for-each select=".|following-sibling::row[position() &lt; 3 ]">
          zu:
          <xsl:for-each select=".|following-sibling::row[category = 1 and position() &lt; 3 ]">

          erstmal danke das du mir helfen möchtest. Deine Änderung hab ich gemacht und es hat ergeben das mir jetzt alle produkte der category=1 angezeigt werden in drei spalten je zeile. ABER darunter werden mir alle anderen produkte angezeigt in einer spalte pro zeile.

          Ich habe aber nicht gesagt, dass du category = 1 aus dem ersten for-each rausnehmen sollst! ;-)

          <xsl:for-each select=" products/row[category = 1 and position() mod 3 = 1]">

          <tr>
                 <xsl:for-each select=".|following-sibling::row[category = 1 and position() &lt; 3 ]">
                  <td class="td">
                   <a href="{link}">
                    <img src="{image_link}" alt="{title}" /><br/>
                    <xsl:value-of select="title"/>
                   </a>
                   <br/>
                   <xsl:value-of select="price"/>
                  </td>
                 </xsl:for-each>
                </tr>

          </xsl:for-each>

          
          >   
          >   
          >   
          > Grüße  
          > Thomas  
            
          Mensch Thomas ich muss dich nochmal in Anspruch nehmen. Ich hab jetzt festgestellt das es da doch noch ein Problem gibt. Ich versuch mal das zu erklären. Ich lasse mir als beispiel jetzt category 1 und 2 anzeigen. Dabei viel mir auf das nicht alle produkte erscheinen. Category 1 endet in der letzten zeile mit einer spalte. Daraufhin fallen die ersten zwei aus der category 2 weg. Ich nehme an das liegt an dem mod 3 = 1.  
            
          Wenn ich mir nämlich alle Produkte aus allen Kategorien anzeigen lasse, wären das letzte Produkt aus category 1 und die ersten zwei aus category 2 in einer Zeile.  
            
          Wär super wenn du dir das nochmal angucken würdest.  
            
          danke und gruß  
            
          J32  
            
          
          
          1. Hallo,

            Mensch Thomas ich muss dich nochmal in Anspruch nehmen. Ich hab jetzt festgestellt das es da doch noch ein Problem gibt. Ich versuch mal das zu erklären. Ich lasse mir als beispiel jetzt category 1 und 2 anzeigen. Dabei viel mir auf das nicht alle produkte erscheinen. Category 1 endet in der letzten zeile mit einer spalte. Daraufhin fallen die ersten zwei aus der category 2 weg. Ich nehme an das liegt an dem mod 3 = 1.

            Das verstehe ich jetzt nicht. Bzw, wenn du was an dem XSL geändert hast, poste das bitte dazu.

            Grüße
            Thomas

            1. Hallo,

              Mensch Thomas ich muss dich nochmal in Anspruch nehmen. Ich hab jetzt festgestellt das es da doch noch ein Problem gibt. Ich versuch mal das zu erklären. Ich lasse mir als beispiel jetzt category 1 und 2 anzeigen. Dabei viel mir auf das nicht alle produkte erscheinen. Category 1 endet in der letzten zeile mit einer spalte. Daraufhin fallen die ersten zwei aus der category 2 weg. Ich nehme an das liegt an dem mod 3 = 1.

              Das verstehe ich jetzt nicht. Bzw, wenn du was an dem XSL geändert hast, poste das bitte dazu.

              Grüße
              Thomas

              Das XSL file hat sich nicht geändert. Ich habe lediglich die nummer für die category von 1 auf 3 verändert. Dann erscheinen 6 meiner Produkte. In category=3 befinden sich jedoch 8 Produkte.

              <?xml version="1.0" encoding="ISO-8859-1"?>  
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
              <xsl:output method="html" indent="yes" encoding="iso-8859-1" />  
              <xsl:template match="/">  
               <html>  
               <head>  
               <link rel="stylesheet" type="text/css" href="./css/main.css"/>  
               </head>  
               <body>  
                
                 <table class="table">  
                 <xsl:for-each select="products/row[category = 3 and position() mod 3 = 1]">  
                   <tr>  
                   <xsl:for-each select=".|following-sibling::row[category = 3 and position() &lt; 3 ]">  
                    <td class="td">  
                     <xsl:element name="a">  
                     <xsl:attribute name="href">  
                     <xsl:value-of select="/link"/>  
                     </xsl:attribute>  
                       <img>  
                       <xsl:attribute name="src">  
                        <xsl:value-of select="image_link"/>  
                       </xsl:attribute>  
                       <xsl:attribute name="alt">  
                        <xsl:value-of select="title"/>  
                       </xsl:attribute>  
                       </img><br/>  
                       <xsl:value-of select="title"/>  
                     </xsl:element><br/>  
                     <xsl:value-of select="price"/><br/>  
                     <xsl:value-of select="category"/>  
                    </td>  
                    </xsl:for-each>  
              </tr>  
                
              </xsl:for-each>  
                 </table>  
               </body>  
               </html>  
              </xsl:template>  
                
              </xsl:stylesheet>
              

              Wenn ich jetzt in beiden for-each zeilen das category = 1 rausnehme, werden mir alle Produkte aus allen Kategorien angezeigt. Aufgrund mod 3 = 1 wird aus normalerweise drei Zeilen eine gemacht. Das bewirkt, das durch die Anzahl an Produkten, das letzte Produkt von Kategorie 2 zusammen mit zwei Produkten aus Kategorie 3 eine Zeile bildet. Lasse ich mir jetzt nur Kategorie 3 anzeigen, fehlen mir genau diese zwei Produkte.

              Weil das jetzt alles so umständlich klingt hier zwei links um es zu veranschaulichen.

              Link 1 zeigt alle Produkte an. Die letzte Nummer unter jedem Produkt ist die Kategorie Nr. damit du siehst wo Kategorie 2 aufhört und 3 anfängt.

              http://tshirt4you.cwc.tc/heartsinlove.XML

              Link 2 zeigt nur Kategorie 3. Wie du hier siehst fehlen jetzt die zwei Produkte wie schon oben beschrieben.

              http://tshirt4you.cwc.tc/heartsinlov.XML

              danke

              J32

              1. Hallo,

                Das XSL file hat sich nicht geändert.

                doch, denn [category = *] gibt es nicht ( bzw. beduetet hier das gleiche wie category = node() ) Wenn du alle produkete ausgeben willst, lasse einfach "category = " weg.

                Ich habe lediglich die nummer für die category von 1 auf 3 verändert. Dann erscheinen 6 meiner Produkte. In category=3 befinden sich jedoch 8 Produkte.

                Ah, ich sehe schon.

                  
                    <table class="table">  
                     <xsl:variable name="items" select="products/row[category = 3]" />  
                     <xsl:for-each select="$items[position() mod 3 = 1]">  
                      <tr>  
                       <xsl:for-each select=".|following-sibling::row[category = 3 and position() &lt; 3]">  
                        <td class="td">  
                         <a href="{link}">  
                          <img src="{image_link}" alt="{title}" /><br/>  
                          <xsl:value-of select="title"/>  
                         </a>  
                         <br/>  
                         <xsl:value-of select="price"/>  
                        </td>  
                       </xsl:for-each>  
                      </tr>  
                     </xsl:for-each>  
                    </table>  
                
                

                Wenn du jetzt alle Prod. ausgeben willst, kannst du - wie oben gesagt - "category = " weglassen.

                Grüße
                Thomas

                1. Hallo,

                  Das XSL file hat sich nicht geändert.

                  doch, denn [category = *] gibt es nicht ( bzw. beduetet hier das gleiche wie category = node() ) Wenn du alle produkete ausgeben willst, lasse einfach "category = " weg.

                  Ich habe lediglich die nummer für die category von 1 auf 3 verändert. Dann erscheinen 6 meiner Produkte. In category=3 befinden sich jedoch 8 Produkte.

                  Ah, ich sehe schon.

                  <table class="table">
                       <xsl:variable name="items" select="products/row[category = 3]" />
                       <xsl:for-each select="$items[position() mod 3 = 1]">
                        <tr>
                         <xsl:for-each select=".|following-sibling::row[category = 3 and position() &lt; 3]">
                          <td class="td">
                           <a href="{link}">
                            <img src="{image_link}" alt="{title}" /><br/>
                            <xsl:value-of select="title"/>
                           </a>
                           <br/>
                           <xsl:value-of select="price"/>
                          </td>
                         </xsl:for-each>
                        </tr>
                       </xsl:for-each>
                      </table>

                  
                  >   
                  > Wenn du jetzt alle Prod. ausgeben willst, kannst du - wie oben gesagt - "category = " weglassen.  
                  >   
                  > Grüße  
                  > Thomas  
                    
                  Oh da haben wir uns jetzt wohl falsch verstanden. Mein Problem war nicht das ich mir alle produkte anzeigen lassen will, sondern das mir wenn ich die category = 3 reinschreibe mir nicht alle angezeigt werden die in Kategorie 3 sind. Es fehlen welche. Es werden von 8 Produkten die der Kategorie 3 zugeordnet sind nur 6 angezeigt.  
                    
                  Das xml file mit dem category = \* war nur für die veranschaulichung meines Problems gedacht. Das wichtigere war eigentlich das andere. Sorry da hätt ich mich wohl besser ausdrücken müssen.
                  
                  1. Hallo,

                    Oh da haben wir uns jetzt wohl falsch verstanden.

                    Das glaube ich eher nicht.

                    Mein Problem war nicht das ich mir alle produkte anzeigen lassen will, sondern das mir wenn ich die category = 3 reinschreibe mir nicht alle angezeigt werden die in Kategorie 3 sind. Es fehlen welche. Es werden von 8 Produkten die der Kategorie 3 zugeordnet sind nur 6 angezeigt.

                    Wenn du den code dir anschaust, wirst du feststellen, dass mit ihm genau das nicht mehr passiert (nämlich, dass er dir was "unterschlägt).

                    Grüße
                    Thomas

                    1. Hallo,

                      Oh da haben wir uns jetzt wohl falsch verstanden.

                      Das glaube ich eher nicht.

                      Mein Problem war nicht das ich mir alle produkte anzeigen lassen will, sondern das mir wenn ich die category = 3 reinschreibe mir nicht alle angezeigt werden die in Kategorie 3 sind. Es fehlen welche. Es werden von 8 Produkten die der Kategorie 3 zugeordnet sind nur 6 angezeigt.

                      Wenn du den code dir anschaust, wirst du feststellen, dass mit ihm genau das nicht mehr passiert (nämlich, dass er dir was "unterschlägt).

                      Grüße
                      Thomas

                      Also ich hab jetzt folgende varianten probiert.

                      1.
                      category = 3 in beiden for-each vorhanden = 6 von 8 produkten aus Kategorie 3 (ich brauche aber 8 von 8)

                      2.
                      category = 3 in keiner von beiden for-each = Ausgabe aller produkte aus allen kategorien (ich brauche aber nicht alle Kategorien auf einmal sondern jede einzeln und vollständig)

                      3.
                      category = 3 nur im ersten for-each = 6 von 8 produkten aus Kategorie 3 (ich brauche aber 8 von 8)

                      4.
                      category = 3 nur im zweiten for-each = Ausgabe aller Produkte aus allen Kategorien. Bis auf Kategorie 3 befindet sich alles in einer Spalte untereinander. (das ist es auch nicht)

                      Das einzige wo mir der code wie du sagst, nichts unterschlägt, ist in meinem oben erwähnten Punkt 2. Das ist aber nicht das was ich brauche.

                      Was ich möchte ist das ich mir jede Kategorie einzeln und komplett anzeigen lassen kann. Wie ich es auch drehe und wende, es klappt nicht.

                      Da muss noch irgendwas sein was ich entweder nicht sehe oder falsch verstanden hab an deinen Posts.

                      Ich hoffe du gibst jetzt nicht auf an mir :D

                    2. Hallo,

                      Oh da haben wir uns jetzt wohl falsch verstanden.

                      Das glaube ich eher nicht.

                      Mein Problem war nicht das ich mir alle produkte anzeigen lassen will, sondern das mir wenn ich die category = 3 reinschreibe mir nicht alle angezeigt werden die in Kategorie 3 sind. Es fehlen welche. Es werden von 8 Produkten die der Kategorie 3 zugeordnet sind nur 6 angezeigt.

                      Wenn du den code dir anschaust, wirst du feststellen, dass mit ihm genau das nicht mehr passiert (nämlich, dass er dir was "unterschlägt).

                      Grüße
                      Thomas

                      ah ich hab das Post von Christian Seiler völlig übersehen...deshalb gabs wohl das missverständnis von meiner seite ...

                      vielen dank für die Hilfe...

              2. Hallo,

                Das XSL file hat sich nicht geändert. Ich habe lediglich die nummer für die category von 1 auf 3 verändert. Dann erscheinen 6 meiner Produkte. In category=3 befinden sich jedoch 8 Produkte.

                   <xsl:for-each select="products/row[category = 3][position() mod 3 = 1]">  
                     <tr>  
                     <xsl:for-each select=".|following-sibling::row[category = 3][position() &lt; 3 ]">
                

                [category = 3 and position() mod 3 = 1] sucht Dir in XPath alle Knoten heraus, deren Kategorie 3 ist und deren Position (bezüglich *aller anderen* Knoten des Typs vorher) mit Rest 1 durch 3 teilbar sind.

                [category = 3][position() mod 3 = 1] sucht Dir dagegen erst alle Knoten heraus, deren Kategorie 3 ist, und *von denen* dann nur diejenigen deren Position innerhalb des Unterknotensatzes mit Rest 1 durch 3 teilbar sind.

                Viele Grüße,
                Christian

                1. Hallo,

                  Das XSL file hat sich nicht geändert. Ich habe lediglich die nummer für die category von 1 auf 3 verändert. Dann erscheinen 6 meiner Produkte. In category=3 befinden sich jedoch 8 Produkte.

                  <xsl:for-each select="products/row[category = 3][position() mod 3 = 1]">

                  <tr>
                       <xsl:for-each select=".|following-sibling::row[category = 3][position() &lt; 3 ]">

                  
                  >   
                  > [category = 3 and position() mod 3 = 1] sucht Dir in XPath alle Knoten heraus, deren Kategorie 3 ist und deren Position (bezüglich \*aller anderen\* Knoten des Typs vorher) mit Rest 1 durch 3 teilbar sind.  
                  >   
                  > [category = 3][position() mod 3 = 1] sucht Dir dagegen erst alle Knoten heraus, deren Kategorie 3 ist, und \*von denen\* dann nur diejenigen deren Position innerhalb des Unterknotensatzes mit Rest 1 durch 3 teilbar sind.  
                  >   
                  > Viele Grüße,  
                  > Christian  
                  >   
                    
                  ach ich wusste gar nicht das das so geht...naja dafür versteh ich davon einfach noch zu wenig...aber jetzt klappts...vielen dank  
                    
                  J32