2016-06-14 10 views
0

Also, ich habe diese XML-Datei (unten) und ich versuche, eine Liste von Reservations pro Customer zu machen. Da Kunden "innerhalb" Reservations sind und nicht eindeutig sind (mehrere Kunden können unterschiedliche Reservierungen vornehmen), hatte ich ein Problem: Ich kann die richtige Menge von Reservations pro Customer abrufen, aber sie erscheinen die Anzahl der Male, die der Kunde in der existiert Datei, weil ich gehe alle Reservations jedes Mal werfen ...For-Each-Schleife ohne wiederholte Knoten in XSL-Datei

Können Sie, bitte, mir dabei helfen? Ich muss nicht an die HTML-Datei Customers senden, die bereits verarbeitet wurde.


Meine XML-Datei:

<?xml version="1.0" encoding="UTF-8" ?> 
<System xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/Users/ASUS/Documents/lprog-xml/Reservations.xsd"> 
    <Reservations> 
     <Reservation id="b1"> 
      <CourierToken>abb456fb</CourierToken> 
      <CustomerToken>fsdg432n</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>12</day> 
        <month>12</month> 
        <year>2016</year> 
       </Calendar> 
      </BeginDate> 
      <Term>20</Term> 
      <DropPoint id="f33"/> 
      <Customer> 
       <Username>pms</Username> 
       <Password>sdasda</Password> 
       <FirstName>Pedro</FirstName> 
       <LastName>Pinto</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
     <Reservation id="a2"> 
      <CourierToken>dfsd43b2</CourierToken> 
      <CustomerToken>f3hu32mu</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>13</day> 
        <month>January</month> 
        <year>2017</year> 
       </Calendar> 
      </BeginDate> 
      <Term>5</Term> 
      <DropPoint id="f33"/> 
      <Customer> 
       <Username>xss</Username> 
       <Password>asdq</Password> 
       <FirstName>Xavier</FirstName> 
       <LastName>Silva</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
     <Reservation id="a342"> 
      <CourierToken>d4fd43b2</CourierToken> 
      <CustomerToken>f3htg2mu</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>10</day> 
        <month>March</month> 
        <year>2016</year> 
       </Calendar> 
      </BeginDate> 
      <Term>45</Term> 
      <DropPoint id="f33"/> 
      <Customer> 
       <Username>xss</Username> 
       <Password>asdq</Password> 
       <FirstName>Xavier</FirstName> 
       <LastName>Silva</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
     <Reservation id="b3"> 
      <CourierToken>desfg236</CourierToken> 
      <CustomerToken>43jmfh23</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>1</day> 
        <month>January</month> 
        <year>2017</year> 
       </Calendar> 
      </BeginDate> 
      <Term>8</Term> 
      <DropPoint id="g34"/> 
      <Customer> 
       <Username>dal</Username> 
       <Password>dasdg</Password> 
       <FirstName>Daniel</FirstName> 
       <LastName>Almeida</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
     <Reservation id="a56"> 
      <CourierToken>5bh4fdsf</CourierToken> 
      <CustomerToken>onfdsn43</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>23</day> 
        <month>9</month> 
        <year>2018</year> 
       </Calendar> 
      </BeginDate> 
      <Term>15</Term> 
      <DropPoint id="f33"/> 
      <Customer> 
       <Username>pops</Username> 
       <Password>iHack</Password> 
       <FirstName>Migas</FirstName> 
       <LastName>what</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
     <Reservation id="t345"> 
      <CourierToken>432njdas</CourierToken> 
      <CustomerToken>efg234jn</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>25</day> 
        <month>11</month> 
        <year>2567</year> 
       </Calendar> 
      </BeginDate> 
      <Term>56</Term> 
      <DropPoint id="f33"/> 
      <Customer> 
       <Username>SenorJobs</Username> 
       <Password>gr8b8m8ir88/8</Password> 
       <FirstName>Steve</FirstName> 
       <LastName>Jobs</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
     <Reservation id="p45"> 
      <CourierToken>acw4tsca</CourierToken> 
      <CustomerToken>ascfdv32</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>19</day> 
        <month>5</month> 
        <year>2020</year> 
       </Calendar> 
      </BeginDate> 
      <Term>7</Term> 
      <DropPoint id="f33"/> 
      <Customer> 
       <Username>SenorGates</Username> 
       <Password>VivaLaMicrosoft</Password> 
       <FirstName>Billy</FirstName> 
       <LastName>Gator</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
     <Reservation id="df45"> 
      <CourierToken>34rfdf3d</CourierToken> 
      <CustomerToken>554fgdvv</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>21</day> 
        <month>10</month> 
        <year>2020</year> 
       </Calendar> 
      </BeginDate> 
      <Term>20</Term> 
      <DropPoint id="f33"/> 
      <Customer> 
       <Username>CristianoPenaldo</Username> 
       <Password>saudadesIrina</Password> 
       <FirstName>Cristiano</FirstName> 
       <LastName>Ronaldo</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
     <Reservation id="po454"> 
      <CourierToken>dfsg345d</CourierToken> 
      <CustomerToken>sadfg345</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>31</day> 
        <month>2</month> 
        <year>2345</year> 
       </Calendar> 
      </BeginDate> 
      <Term>23</Term> 
      <DropPoint id="f33"/> 
      <Customer> 
       <Username>ZLATAN</Username> 
       <Password>iAmZlatan</Password> 
       <FirstName>Zlatan</FirstName> 
       <LastName>Ibrahimovic</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
     <Reservation id="sd34"> 
      <CourierToken>34567asd</CourierToken> 
      <CustomerToken>dssfdgh4</CustomerToken> 
      <BeginDate> 
       <Calendar type="Gregorian"> 
        <day>10</day> 
        <month>10</month> 
        <year>2030</year> 
       </Calendar> 
      </BeginDate> 
      <Term>4</Term> 
      <DropPoint id="f33"/> 
      <Customer> 
       <Username>PashaBiceps</Username> 
       <Password>maFriend</Password> 
       <FirstName>Pasha</FirstName> 
       <LastName>Biceps</LastName> 
       <Email>[email protected]</Email> 
      </Customer> 
     </Reservation> 
    </Reservations> 
    <DropPoints> 
     <DropPoint id="f33"> 
      <Designation>Quinta das Freiras</Designation> 
      <State>Free</State> 
      <Location> 
       <Street>Rio Tinto</Street> 
       <ZipCode>4435-074</ZipCode> 
       <Country>Portugal</Country> 
       <Coordinates> 
        <Longitude>32</Longitude> 
        <Latitude>52</Latitude> 
       </Coordinates> 
      </Location> 
     </DropPoint> 
     <DropPoint id="g34"> 
      <Designation>Norte Shopping</Designation> 
      <State>Free</State> 
      <Location> 
       <Street>Porto</Street> 
       <ZipCode>4488</ZipCode> 
       <Country>Portugal</Country> 
       <Coordinates> 
        <Longitude>24</Longitude> 
        <Latitude>12</Latitude> 
       </Coordinates> 
      </Location> 
     </DropPoint> 
    </DropPoints> 
</System> 

Meine XSL-Datei:

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>Customers</h2> 
       <hr></hr><hr></hr> 
       <!-- select="System/Reservations/Reservation/Customer" --> 

       <xsl:for-each select="System/Reservations/Reservation/Customer"> 
        <xsl:variable name="customerEmail" select="Email"/> 

        <h4><b>Name: </b> <xsl:value-of select="FirstName"/> <xsl:value-of select="LastName"/> </h4> 
        <h4><b>E-mail: </b> <xsl:value-of select="Email"/> </h4> 

        <!-- Creates a table with information about reservations, for each client --> 
        <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th>Reservation ID</th> 
         <th>Date</th> 
         <th>Duration (days)</th> 
         <th>Customer Token</th> 
        </tr> 

        <xsl:for-each select="../../Reservation"> 
         <xsl:variable name="customerEmailCurrentReservation" select="Customer/Email"/> 

         <!-- processes reservations for that customer only --> 
         <xsl:if test="$customerEmail=$customerEmailCurrentReservation"> 

          <tr>          
           <td><xsl:value-of select="@id"/></td> 
           <td><xsl:value-of select="BeginDate/Calendar/day"/>-<xsl:value-of select="BeginDate/Calendar/month"/>-<xsl:value-of select="BeginDate/Calendar/year"/></td> 
           <td><xsl:value-of select="Term"/></td> 
           <td><xsl:value-of select="CustomerToken"/></td> 
          </tr> 

         </xsl:if> 
        </xsl:for-each> 

        </table> <!-- End of the table for that customer --> 
        <br></br><hr></hr><br></br> 
       </xsl:for-each> 
      </body> 
     </html> 
    </xsl:template> 

</xsl:stylesheet> 

Dies ist, was ich (in der HTML-transformierten Datei) erhalten: enter image description here


Und das ist, was ich erhalten möchten: enter image description here

Vielen Dank im Voraus!

+0

Dies ist ein * Gruppierung * Problem - siehe: http: //www.jenitennison. com/xslt/grouping/muenchian.html und zahlreiche Beispiele der Münchischen Gruppierung hier auf SO. –

+0

@ michael.hor257k Vielen Dank, ich habe tatsächlich versucht, das zu verwenden, aber ich habe ein paar Probleme ... Wenn ich einen Schlüssel vor der ersten für jede Schleife definieren, wie dies '', es heißt, dass das XSL nicht gültig ist ... irgendwelche Hilfe? Danke, ich bin neu bei XSL ... –

+0

Sie sollten Sie versuchen, geschrieben haben, damit wir es beheben können, anstatt alles von Grund auf neu zu schreiben. Und nein - die Schlüsseldefinition, die Sie zeigen, führt ** nicht ** zu einem Fehler. –

Antwort

1

Das letzte, was wir brauchen, ist noch ein weiteres Beispiel der Münchischen Gruppierung. Aber da kann man nicht auf eigene Faust zu verwalten scheinen, versuchen Sie es auf diese Weise:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:key name="reservation-by-customer" match="Reservation" use="Customer/Email" /> 

<xsl:template match="/System"> 
    <html> 
     <body> 
      <h2>Customers</h2> 
      <!-- for each distinct customer --> 
      <xsl:for-each select="Reservations/Reservation[count(. | key('reservation-by-customer', Customer/Email)[1]) = 1]"> 
       <!-- customer's details --> 
       <h4> 
        <xsl:text>Name: </xsl:text> 
        <xsl:value-of select="Customer/FirstName"/> 
        <xsl:text> </xsl:text> 
        <xsl:value-of select="Customer/LastName"/> 
       </h4> 
       <!-- customer's reservations --> 
       <table border="1"> 
        <tr> 
         <th>Reservation ID</th> 
         <th>Date</th> 
         <th>Duration (days)</th> 
         <th>Customer Token</th> 
        </tr> 
        <xsl:for-each select="key('reservation-by-customer', Customer/Email)"> 
         <tr>          
          <td> 
           <xsl:value-of select="@id"/> 
          </td> 
          <td> 
           <xsl:value-of select="BeginDate/Calendar/day"/> 
           <xsl:text>-</xsl:text> 
           <xsl:value-of select="BeginDate/Calendar/month"/> 
           <xsl:text>-</xsl:text> 
           <xsl:value-of select="BeginDate/Calendar/year"/> 
          </td> 
          <td> 
           <xsl:value-of select="Term"/> 
          </td> 
          <td> 
           <xsl:value-of select="CustomerToken"/> 
          </td> 
         </tr> 
        </xsl:for-each> 
       </table> 
       <hr/> 
      </xsl:for-each> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 
+0

Vielen Dank! Ich wusste nicht, dass wir den Schlüssel im "for-each" verwenden könnten! Danke nochmal :) –