#Extrapolated from an example from Michael Kay to ??? on 7 Feb 2000, with numerous corrections: well-formedness and semantics

from Ft.Xml.Domlette import implementation

from Xml.Xslt import test_harness
import cStringIO
from Ft.Xml.Domlette import Print

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

<xsl:output method='html'/>

<xsl:template match="/">
  <table>
    <xsl:apply-templates/>
  </table>
</xsl:template>

<xsl:template match="table">
    <xsl:call-template name="one-row">
      <xsl:with-param name="row-num" select="1"/>
    </xsl:call-template>
</xsl:template>

<!-- From Michael Kay -->
<xsl:template name="one-row">
  <xsl:param name="row-num" select="1"/>
  <tr>
  <xsl:for-each select="row">
     <td><xsl:value-of select="*[$row-num]"/></td>
  </xsl:for-each>
  </tr>
  <xsl:if test="row/*[$row-num+1]">
    <xsl:call-template name="one-row">
      <xsl:with-param name="row-num" select="$row-num+1"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>
<!-- END From Michael Kay -->

</xsl:transform>"""

expected_1 = """<table>
  <tr>
    <td>1</td>
    <td>11</td>
    <td>21</td>
    <td>31</td>
    <td>41</td>
    <td>51</td>
    <td>61</td>
    <td>71</td>
    <td>81</td>
    <td>91</td>
  </tr>
  <tr>
    <td>2</td>
    <td>12</td>
    <td>22</td>
    <td>32</td>
    <td>42</td>
    <td>52</td>
    <td>62</td>
    <td>72</td>
    <td>82</td>
    <td>92</td>
  </tr>
  <tr>
    <td>3</td>
    <td>13</td>
    <td>23</td>
    <td>33</td>
    <td>43</td>
    <td>53</td>
    <td>63</td>
    <td>73</td>
    <td>83</td>
    <td>93</td>
  </tr>
  <tr>
    <td>4</td>
    <td>14</td>
    <td>24</td>
    <td>34</td>
    <td>44</td>
    <td>54</td>
    <td>64</td>
    <td>74</td>
    <td>84</td>
    <td>94</td>
  </tr>
  <tr>
    <td>5</td>
    <td>15</td>
    <td>25</td>
    <td>35</td>
    <td>45</td>
    <td>55</td>
    <td>65</td>
    <td>75</td>
    <td>85</td>
    <td>95</td>
  </tr>
  <tr>
    <td>6</td>
    <td>16</td>
    <td>26</td>
    <td>36</td>
    <td>46</td>
    <td>56</td>
    <td>66</td>
    <td>76</td>
    <td>86</td>
    <td>96</td>
  </tr>
  <tr>
    <td>7</td>
    <td>17</td>
    <td>27</td>
    <td>37</td>
    <td>47</td>
    <td>57</td>
    <td>67</td>
    <td>77</td>
    <td>87</td>
    <td>97</td>
  </tr>
  <tr>
    <td>8</td>
    <td>18</td>
    <td>28</td>
    <td>38</td>
    <td>48</td>
    <td>58</td>
    <td>68</td>
    <td>78</td>
    <td>88</td>
    <td>98</td>
  </tr>
  <tr>
    <td>9</td>
    <td>19</td>
    <td>29</td>
    <td>39</td>
    <td>49</td>
    <td>59</td>
    <td>69</td>
    <td>79</td>
    <td>89</td>
    <td>99</td>
  </tr>
  <tr>
    <td>10</td>
    <td>20</td>
    <td>30</td>
    <td>40</td>
    <td>50</td>
    <td>60</td>
    <td>70</td>
    <td>80</td>
    <td>90</td>
    <td>100</td>
  </tr>
</table>"""

SIZE=10

def Test(tester):
    #Create the matrix to be transposed
    doc = implementation.createDocument(None, 'table', None)
    counter = 1
    for row in range(SIZE):
        row_elem = doc.createElementNS(None, 'row')
        doc.documentElement.appendChild(row_elem)
        for col in range(SIZE):
            col_elem = doc.createElementNS(None, 'column')
            row_elem.appendChild(col_elem)
            content = doc.createTextNode(str(counter))
            col_elem.appendChild(content)
            counter = counter + 1


    stream = cStringIO.StringIO()
    Print(doc,stream)

    source = test_harness.FileInfo(string=stream.getvalue())
    sheet = test_harness.FileInfo(string=sheet_1)
    test_harness.XsltTest(tester, source, [sheet], expected_1)
    return
