Bob's Burgers

From ICO wiki
Jump to navigationJump to search

Meeskond

  • Aleksei Kopõlov
  • Sander Perens

Idee

XML/XSD/XSLT

XML

<?xml version="1.0" encoding="utf-8"?>
<Menu>
  <Item Category="Dish" MenuCategorie="Main course">
    <ItemName><![CDATA[Chicken & mushroom risotto]]></ItemName>
    <ItemType>
      <Type>Spicy</Type>
    </ItemType>
    <Portions>
      <Portion PortionType="Small">
        <PortionPrice Currency="€">10.95</PortionPrice>
        <PortionSize>
          <Size Units="g">300</Size>
          <Size Units="Person">1</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Medium">
        <PortionPrice Currency="€">19.95</PortionPrice>
        <PortionSize>
          <Size Units="g">600</Size>
          <Size Units="Person">2</Size>
        </PortionSize>
      </Portion>
    </Portions>
    <Description>Looks good</Description>
    <Ingredients>
      <Ingredient Units="g" Quantity="50">Butter</Ingredient>
      <Ingredient Units="g" Quantity="100">Bacon</Ingredient>
      <Ingredient Units="g" Quantity="100">Rice</Ingredient>
      <Ingredient Units="ml" Quantity="50">White wine</Ingredient>
    </Ingredients>
    <IntoleranceFreeFood>
      <IntoleranceFree>Lactose Free</IntoleranceFree>
      <IntoleranceFree>Gluten free</IntoleranceFree>
    </IntoleranceFreeFood>
  </Item>

  <Item Category="Dish" MenuCategorie="Main course">
    <ItemName><![CDATA[Pilaff]]></ItemName>
    <ItemType>
      <Type>Spicy</Type>
      <Type>mediterranean</Type>
    </ItemType>
    <Portions>
      <Portion PortionType="Small">
        <PortionPrice Currency="€">5</PortionPrice>
        <PortionSize>
          <Size Units="g">300</Size>
          <Size Units="Person">1</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Medium">
        <PortionPrice Currency="€">6</PortionPrice>
        <PortionSize>
          <Size Units="g">600</Size>
          <Size Units="Person">2</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Large">
        <PortionPrice Currency="€">7</PortionPrice>
        <PortionSize>
          <Size Units="g">900</Size>
          <Size Units="Person">3</Size>
        </PortionSize>
      </Portion>
    </Portions>
    <Description>Looks good</Description>
    <Ingredients>
      <Ingredient Units="g" Quantity="50">Butter</Ingredient>
      <Ingredient Units="g" Quantity="100">Bacon</Ingredient>
      <Ingredient Units="g" Quantity="100">Rice</Ingredient>
    </Ingredients>
    <IntoleranceFreeFood>
      <IntoleranceFree>Lactose Free</IntoleranceFree>
      <IntoleranceFree>Gluten free</IntoleranceFree>
    </IntoleranceFreeFood>
  </Item>

  <Item Category="Dish" MenuCategorie="Dessert">
    <ItemName><![CDATA[Classic Tiramisu]]></ItemName>
    <ItemType>
      <Type>Spicy</Type>
      <Type>Sour</Type>
    </ItemType>
    <Portions>
      <Portion PortionType="Small">
        <PortionPrice Currency="€">10.95</PortionPrice>
        <PortionSize>
          <Size Units="g">300</Size>
          <Size Units="Person">1</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Medium">
        <PortionPrice Currency="€">19.95</PortionPrice>
        <PortionSize>
          <Size Units="g">600</Size>
          <Size Units="Person">2</Size>
        </PortionSize>
      </Portion>
    </Portions>
    <Description>Looks good, tastes okay</Description>
    <Ingredients>
      <Ingredient Units="g" Quantity="50">Butter</Ingredient>
      <Ingredient Units="g" Quantity="100">Bacon</Ingredient>
      <Ingredient Units="g" Quantity="100">Rice</Ingredient>
      <Ingredient Units="g" Quantity="50">White wine</Ingredient>
    </Ingredients>
  </Item>

  <Item Category="Dish" MenuCategorie="Dessert">
    <ItemName><![CDATA[Pavlova]]></ItemName>
    <ItemType>
      <Type>Sweet</Type>
    </ItemType>
    <Portions>
      <Portion PortionType="Small">
        <PortionPrice Currency="€">13.13</PortionPrice>
        <PortionSize>
          <Size Units="g">300</Size>
          <Size Units="Person">2</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Large">
        <PortionPrice Currency="€">27.99</PortionPrice>
        <PortionSize>
          <Size Units="g">600</Size>
          <Size Units="Person">4</Size>
        </PortionSize>
      </Portion>
    </Portions>
    <Description>Pavlova typically garnished with strawberries, passionfruit, kiwifruit and cream. Pavlova is a meringue-based dessert named after the Russian ballerina Anna Pavlova. It is a meringue dessert with a crisp crust and soft, light inside, usually topped with fruit and whipped cream.</Description>
    <Ingredients>
      <Ingredient Units="g" Quantity="50">strawberries</Ingredient>
      <Ingredient Units="g" Quantity="100">passionfruit</Ingredient>
      <Ingredient Units="g" Quantity="100">kiwifruit</Ingredient>
      <Ingredient Units="ml" Quantity="100">cream</Ingredient>
    </Ingredients>
  </Item>

  <Item Category="Drink" MenuCategorie="Alcohol">
    <ItemName><![CDATA[Jem Beam]]></ItemName>
    <ItemType>
      <Type>Whisky</Type>
    </ItemType>
    <Portions>
      <Portion PortionType="Small">
        <PortionPrice Currency="€">2.95</PortionPrice>
        <PortionSize>
          <Size Units="ml">30</Size>
          <Size Units="Shots">1</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Medium">
        <PortionPrice Currency="€">14.95</PortionPrice>
        <PortionSize>
          <Size Units="ml">300</Size>
          <Size Units="Shots">10</Size>
        </PortionSize>
      </Portion>
    </Portions>
    <Description>Whisky</Description>
  </Item>

  <Item Category="Drink" MenuCategorie="Juice">
    <ItemName><![CDATA[Apple juice]]></ItemName>
    <ItemType>
      <Type>Juice</Type>
    </ItemType>
    <Portions>
      <Portion PortionType="Small">
        <PortionPrice Currency="€">1.05</PortionPrice>
        <PortionSize>
          <Size Units="ml">200</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Medium">
        <PortionPrice Currency="€">1.55</PortionPrice>
        <PortionSize>
          <Size Units="ml">300</Size>
        </PortionSize>
      </Portion>
    </Portions>
    <Description>Freshly pressed from green apples</Description>
  </Item>

  <Item Category="Drink" MenuCategorie="Water">
    <ItemName><![CDATA[Still water]]></ItemName>
    <ItemType>
      <Type>Water</Type>
    </ItemType>
    <Portions>
      <Portion PortionType="Small">
        <PortionPrice Currency="€">1</PortionPrice>
        <PortionSize>
          <Size Units="ml">200</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Medium">
        <PortionPrice Currency="€">1.50</PortionPrice>
        <PortionSize>
          <Size Units="ml">300</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Large">
        <PortionPrice Currency="€">2</PortionPrice>
        <PortionSize>
          <Size Units="ml">500</Size>
        </PortionSize>
      </Portion>
    </Portions>
    <Description>From tap</Description>
  </Item>

  <Item Category="Drink" MenuCategorie="Alcohol">
    <ItemName><![CDATA[Saku Kuld]]></ItemName>
    <ItemType>
      <Type>Beer</Type>
    </ItemType>
    <Portions>
      <Portion PortionType="Small">
        <PortionPrice Currency="€">3.50</PortionPrice>
        <PortionSize>
          <Size Units="ml">300</Size>
        </PortionSize>
      </Portion>
      <Portion PortionType="Medium">
        <PortionPrice Currency="€">5</PortionPrice>
        <PortionSize>
          <Size Units="ml">500</Size>
        </PortionSize>
      </Portion>
    </Portions>
    <Description>Saku Kuld is the finest beer of Estonia’s oldest brewery. It is the cream of the crop when it comes to beers. Saku Kuld is a masterpiece that entwines two centuries of brewing traditions with the latest technology.</Description>
  </Item>
</Menu>

XSD

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Menu">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Item" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ItemName" type="xs:string" maxOccurs="1" minOccurs="1"/>
              <xs:element name="ItemType" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Type" type ="xs:string" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Portions" minOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Portion" minOccurs="1" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="PortionPrice" minOccurs="1" maxOccurs="1">
                            <xs:complexType>
                              <xs:simpleContent>
                                <xs:extension base="xs:decimal">
                                  <xs:attribute name="Currency" type="xs:string"/>
                                </xs:extension>
                              </xs:simpleContent>
                            </xs:complexType>
                          </xs:element>
                          <xs:element name="PortionSize" minOccurs="1" maxOccurs="1">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="Size" minOccurs="1" maxOccurs="unbounded">
                                  <xs:complexType>
                                    <xs:simpleContent>
                                      <xs:extension base="xs:decimal">
                                        <xs:attribute name="Units" type="xs:string"/>
                                      </xs:extension>
                                    </xs:simpleContent>
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                        <xs:attribute name="PortionType" type="xs:string" use="required"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Description" type="xs:string" minOccurs="1" maxOccurs="1"/>
              <xs:element name="Ingredients" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Ingredient" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute name="Units" type="xs:string"/>
                            <xs:attribute name="Quantity" type="xs:decimal"/>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="IntoleranceFreeFood" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="IntoleranceFree" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="Category" type="xs:string"/>
            <xs:attribute name="MenuCategorie" type="xs:string" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XSLT HTML

<html>
  <style>
        table {
        border-collapse: collapse;
        margin: 25px;
        margin-bottom: 50px;
        }
        th, td {
        border: 1px solid #ccc;
        padding: 10px;
        text-align: center;
        }
        td.exept{
        text-align: left;
        width:60%
        }
      </style>
  <body>
    <h1 align="center">Menu</h1>
    <table>
      <thead>
        <tr class="border">
          <td align="center" colspan="4">
            <h2>Dishes</h2>
          </td>
        </tr>
        <tr class="TableHead">
          <th rowspan="2">Name</th>
          <th colspan="3">Price</th>
        </tr>
        <tr>
          <th>Small</th>
          <th>Medium</th>
          <th>Large</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td colspan="4">Main course</td>
        </tr>
        <tr>
          <td class="exept">Chicken & mushroom risotto<br>
                    Description:Looks good<br>
                    Additional information:
                    <ul>
              <li>Lactose Free</li>
              <li>Gluten free</li>
            </ul>
          </td>
          <td>10.95€</td>
          <td>19.95€</td>
          <td></td>
        </tr>
        <tr>
          <td class="exept">Pilaff<br>
                    Description:Looks good<br>
                    Additional information:
                    <ul>
              <li>Lactose Free</li>
              <li>Gluten free</li>
            </ul>
          </td>
          <td>5€</td>
          <td>6€</td>
          <td>7€</td>
        </tr>
        <tr>
          <td colspan="4">Dessert</td>
        </tr>
        <tr>
          <td class="exept">Classic Tiramisu<br>
                    Description:Looks good, tastes okay<br>
                    Additional information:
                    <ul></ul>
          </td>
          <td>10.95€</td>
          <td>19.95€</td>
          <td></td>
        </tr>
        <tr>
          <td class="exept">Pavlova<br>
                    Description:Pavlova typically garnished with strawberries, passionfruit, kiwifruit and cream. Pavlova is a meringue-based dessert named after the Russian ballerina Anna Pavlova. It is a meringue dessert with a crisp crust and soft, light inside, usually topped with fruit and whipped cream.<br>
                    Additional information:
                    <ul></ul>
          </td>
          <td>13.13€</td>
          <td></td>
          <td>27.99€</td>
        </tr>
      </tbody>
    </table>
    <table>
      <thead>
        <tr class="border">
          <td align="center" colspan="4">
            <h2>Drinks</h2>
          </td>
        </tr>
        <tr class="TableHead">
          <th rowspan="2">Name</th>
          <th colspan="3">Price</th>
        </tr>
        <tr>
          <th>Small</th>
          <th>Medium</th>
          <th>Large</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td colspan="4">Alcohol</td>
        </tr>
        <tr>
          <td class="exept">Jem Beam<br>
                    Description:Whisky</td>
          <td>2.95€</td>
          <td>14.95€</td>
          <td></td>
        </tr>
        <tr>
          <td class="exept">Saku Kuld<br>
                    Description:Saku Kuld is the finest beer of Estonia’s oldest brewery. It is the cream of the crop when it comes to beers. Saku Kuld is a masterpiece that entwines two centuries of brewing traditions with the latest technology.</td>
          <td>3.50€</td>
          <td>5€</td>
          <td></td>
        </tr>
        <tr>
          <td colspan="4">Non-Alcohol</td>
        </tr>
        <tr>
          <td class="exept">Apple juice<br>
                    Description:Freshly pressed from green apples</td>
          <td>1.05€</td>
          <td>1.55€</td>
          <td></td>
        </tr>
        <tr>
          <td class="exept">Still water<br>
                    Description:From tap</td>
          <td>1€</td>
          <td>1.50€</td>
          <td>2€</td>
        </tr>
      </tbody>
    </table>
  </body>
</html>

XSLT XML

<?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="/Menu">
    <html>
      <style>
        table {
        border-collapse: collapse;
        margin: 25px;
        margin-bottom: 50px;
        }
        th, td {
        border: 1px solid #ccc;
        padding: 10px;
        text-align: center;
        }
        td.exept{
        text-align: left;
        width:60%
        }
      </style>
      <body>
        <h1 align="center">Menu</h1>
        <table>
          <thead>
            <tr class="border">
              <td align="center" colspan="4">
                <h2>Dishes</h2>
              </td>
            </tr>
            <tr class="TableHead">
              <th rowspan="2">Name</th>
              <th colspan="3">Price</th>
            </tr>
            <tr>
              <th>Small</th>
              <th>Medium</th>
              <th>Large</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td colspan="4">Main course</td>
            </tr>
            <xsl:for-each select="Item">
              <xsl:if test="@Category='Dish' and @MenuCategorie = 'Main course'">
                <tr>
                  <td class="exept">
                    <xsl:value-of select="ItemName"/><br/>
                    Description:<xsl:value-of select="Description"/>
                    <br/>
                    Additional information:
                    <ul>
                      <xsl:for-each select="IntoleranceFreeFood/IntoleranceFree">
                        <li>
                          <xsl:value-of select="."/>
                        </li>
                      </xsl:for-each>
                    </ul>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Small'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Medium'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Large'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                </tr>
              </xsl:if>
            </xsl:for-each>
            <tr>
              <td colspan="4">Dessert</td>
            </tr>
            <xsl:for-each select="Item">
              <xsl:if test="@Category='Dish' and @MenuCategorie = 'Dessert'">
                <tr>
                  <td class="exept">
                    <xsl:value-of select="ItemName"/><br/>
                    Description:<xsl:value-of select="Description"/>
                    <br/>
                    Additional information:
                    <ul>
                      <xsl:for-each select="IntoleranceFreeFood/IntoleranceFree">
                        <li>
                          <xsl:value-of select="."/>
                        </li>
                      </xsl:for-each>
                    </ul>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Small'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Medium'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Large'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                </tr>
              </xsl:if>
            </xsl:for-each>
          </tbody>
        </table>
        <table>
          <thead>
            <tr class="border">
              <td align="center" colspan="4">
                <h2>Drinks</h2>
              </td>
            </tr>
            <tr class="TableHead">
              <th rowspan="2">Name</th>
              <th colspan="3">Price</th>
            </tr>
            <tr>
              <th>Small</th>
              <th>Medium</th>
              <th>Large</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td colspan="4">Alcohol</td>
            </tr>
            <xsl:for-each select="Item">
              <xsl:if test="@Category='Drink'and @MenuCategorie = 'Alcohol'">
                <tr>
                  <td class="exept">
                    <xsl:value-of select="ItemName"/><br/>
                    Description:<xsl:value-of select="Description"/>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Small'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Medium'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Large'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                </tr>
              </xsl:if>
            </xsl:for-each>
            <tr>
              <td colspan="4">Non-Alcohol</td>
            </tr>
            <xsl:for-each select="Item">
              <xsl:if test="@Category='Drink'and @MenuCategorie != 'Alcohol'">
                <tr>
                  <td class="exept">
                    <xsl:value-of select="ItemName"/><br/>
                    Description:<xsl:value-of select="Description"/>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Small'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Medium'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                  <td>
                    <xsl:for-each select="Portions/Portion">
                      <xsl:if test="@PortionType = 'Large'">
                        <xsl:value-of select="PortionPrice"/>
                        <xsl:value-of select="PortionPrice/@Currency"/>
                      </xsl:if>
                    </xsl:for-each>
                  </td>
                </tr>
              </xsl:if>
            </xsl:for-each>
          </tbody>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>