/ sc05.xsl
sc05.xsl
  1  <?xml version="1.0" encoding="UTF-8"?>
  2  <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3      <xsl:output method="text"/>
  4  
  5      <!-- Define variables for statistics -->
  6      <xsl:variable name="recipeCount" select="count(//recipe)"/>
  7      <xsl:variable name="menuCount" select="count(//menu)"/>
  8      <xsl:variable name="orderCount" select="count(//order)"/>
  9      <xsl:variable name="customerCount" select="count(//customer)"/>
 10      <xsl:variable name="deliveryPeopleCount" select="count(//deliveryPerson)"/>
 11      <xsl:variable name="commentCount" select="count(//comment)"/>
 12  
 13      <!-- Start transformation -->
 14      <xsl:template match="/">
 15          <xsl:text>{</xsl:text>
 16              <!-- Statistics -->
 17              <xsl:text>"statistics": {</xsl:text>
 18                  <xsl:text>"recipeCount": </xsl:text><xsl:value-of select="$recipeCount"/>,
 19                  <xsl:text>"menuCount": </xsl:text><xsl:value-of select="$menuCount"/>,
 20                  <xsl:text>"orderCount": </xsl:text><xsl:value-of select="$orderCount"/>,
 21                  <xsl:text>"customerCount": </xsl:text><xsl:value-of select="$customerCount"/>,
 22                  <xsl:text>"deliveryPeopleCount": </xsl:text><xsl:value-of select="$deliveryPeopleCount"/>,
 23                  <xsl:text>"commentCount": </xsl:text><xsl:value-of select="$commentCount"/>
 24              <xsl:text>},</xsl:text>
 25  
 26              <!-- JSON transformation of elements -->
 27              <xsl:text>"data": {</xsl:text>
 28                  <!-- Recipes -->
 29                  <xsl:text>"recipes": [</xsl:text>
 30                      <xsl:apply-templates select="//recipe"/>
 31                  <xsl:text>],</xsl:text>
 32  
 33                  <!-- Menus -->
 34                  <xsl:text>"menus": [</xsl:text>
 35                      <xsl:apply-templates select="//menu"/>
 36                  <xsl:text>],</xsl:text>
 37  
 38                  <!-- Orders -->
 39                  <xsl:text>"orders": [</xsl:text>
 40                      <xsl:apply-templates select="//order"/>
 41                  <xsl:text>],</xsl:text>
 42  
 43                  <!-- Customers -->
 44                  <xsl:text>"customers": [</xsl:text>
 45                      <xsl:apply-templates select="//customer"/>
 46                  <xsl:text>],</xsl:text>
 47  
 48                  <!-- Delivery People -->
 49                  <xsl:text>"deliveryPeople": [</xsl:text>
 50                      <xsl:apply-templates select="//deliveryPerson"/>
 51                  <xsl:text>],</xsl:text>
 52  
 53                  <!-- Comments -->
 54                  <xsl:text>"comments": [</xsl:text>
 55                      <xsl:apply-templates select="//comment"/>
 56                  <xsl:text>]</xsl:text>
 57              <xsl:text>}</xsl:text>
 58          <xsl:text>}</xsl:text>
 59      </xsl:template>
 60  
 61      <!-- Template for converting recipe -->
 62      <xsl:template match="recipe">
 63          <xsl:text>{"title": "</xsl:text><xsl:value-of select="title"/><xsl:text>", "cuisine": "</xsl:text><xsl:value-of select="cuisine"/><xsl:text>"}</xsl:text>
 64          <xsl:if test="position() != last()">,</xsl:if>
 65      </xsl:template>
 66  
 67      <!-- Template for converting menu -->
 68      <xsl:template match="menu">
 69          <xsl:text>{"name": "</xsl:text><xsl:value-of select="@name"/><xsl:text>", "meals": [</xsl:text>
 70              <xsl:for-each select="meal">
 71                  <xsl:text>{"type": "</xsl:text><xsl:value-of select="@type"/><xsl:text>", "day": "</xsl:text><xsl:value-of select="@day"/><xsl:text>", "recipeId": "</xsl:text><xsl:value-of select="@recipeId"/><xsl:text>"}</xsl:text>
 72                  <xsl:if test="position() != last()">,</xsl:if>
 73              </xsl:for-each>
 74          <xsl:text>]}</xsl:text>
 75          <xsl:if test="position() != last()">,</xsl:if>
 76      </xsl:template>
 77  
 78      <!-- Template for converting order -->
 79      <xsl:template match="order">
 80          <xsl:text>{"id": "</xsl:text><xsl:value-of select="@id"/><xsl:text>", "customerId": "</xsl:text><xsl:value-of select="@customerId"/><xsl:text>", "deliveryPeopleId": "</xsl:text><xsl:value-of select="@deliveryPeopleId"/><xsl:text>", "date": "</xsl:text><xsl:value-of select="@date"/><xsl:text>"}</xsl:text>
 81          <xsl:if test="position() != last()">,</xsl:if>
 82      </xsl:template>
 83  
 84      <!-- Template for converting customer -->
 85      <xsl:template match="customer">
 86          <xsl:text>{"id": "</xsl:text><xsl:value-of select="@id"/><xsl:text>", "name": "</xsl:text><xsl:value-of select="name"/><xsl:text>", "email": "</xsl:text><xsl:value-of select="email"/><xsl:text>", "address": "</xsl:text><xsl:value-of select="address"/><xsl:text>"}</xsl:text>
 87          <xsl:if test="position() != last()">,</xsl:if>
 88      </xsl:template>
 89  
 90      <!-- Template for converting delivery person -->
 91      <xsl:template match="deliveryPerson">
 92          <xsl:text>{"id": "</xsl:text><xsl:value-of select="@id"/><xsl:text>", "name": "</xsl:text><xsl:value-of select="name"/><xsl:text>", "email": "</xsl:text><xsl:value-of select="email"/><xsl:text>", "phone": "</xsl:text><xsl:value-of select="phone"/><xsl:text>"}</xsl:text>
 93          <xsl:if test="position() != last()">,</xsl:if>
 94      </xsl:template>
 95  
 96      <!-- Template for converting comment -->
 97      <xsl:template match="comment">
 98          <xsl:text>{"id": "</xsl:text><xsl:value-of select="@id"/><xsl:text>", "recipeId": "</xsl:text><xsl:value-of select="@recipeId"/><xsl:text>", "customerId": "</xsl:text><xsl:value-of select="@customerId"/><xsl:text>", "text": "</xsl:text><xsl:value-of select="text"/><xsl:text>", "rating": </xsl:text><xsl:value-of select="rating"/><xsl:text>}</xsl:text>
 99          <xsl:if test="position() != last()">,</xsl:if>
100      </xsl:template>
101  </xsl:stylesheet>