Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [xsl] posortowanie, ssumowanie danych, ustawienie odpowiedniego przecinka - zielony ;]
Forum PHP.pl > Forum > XML, AJAX
Terrryy
Mam oto taki plik XML:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <?xml-stylesheet type="text/xsl" href="tranformacja.xsl"?>
  3.  
  4. <faktura nr="234/2006" datawystawienia="2006-10-24" datasprzedazy="2006-10-24">
  5. <sprzedawca nip="677-15-91-304">
  6. <firma>Marpol sp. z o.o.</firma>
  7. <adres>ul. Bajeczna 15</adres>
  8. <kod>32-097</kod>
  9. <miejscowosc>Kraków</miejscowosc>
  10. </sprzedawca>
  11. <nabywca nip="677-15-91-304">
  12. <nazwisko>Wójtowicz</nazwisko>
  13. <imie>Łukasz</imie>
  14. <adres>Al.Niepodległości 109</adres>
  15. <kod>00-912</kod>
  16. <miejscowosc>Warszawa</miejscowosc>
  17. </nabywca>
  18. <pozycja rodzaj="towar">
  19. <nazwa>cegła pełna</nazwa>
  20. <ilosc jm="szt">12600</ilosc>
  21. <cenajednostkowa waluta="PLN">0.26</cenajednostkowa>
  22. <stawkaVAT>22</stawkaVAT>
  23. </pozycja>
  24. <pozycja rodzaj="towar">
  25. <nazwa>cement</nazwa>
  26. <ilosc jm="kg">1420</ilosc>
  27. <cenajednostkowa waluta="PLN">3.50</cenajednostkowa>
  28. <stawkaVAT>7</stawkaVAT>
  29. </pozycja>
  30. </faktura>
  31. <faktura nr="75/FV/2006" datawystawienia="2006-08-07" datasprzedazy="2006-08-12">
  32. <sprzedawca nip="821-00-21-777">
  33. <firma>Rowenta</firma>
  34. <adres>ul. Kurczaby 394</adres>
  35. <kod>41-220</kod>
  36. <miejscowosc>Żyrardów</miejscowosc>
  37. </sprzedawca>
  38. <nabywca nip="223-77-12-567">
  39. <firma>Budopol S.A.</firma>
  40. <adres>ul. Olszaniecka 3</adres>
  41. <kod>12-201</kod>
  42. <miejscowosc>Zielona Góra</miejscowosc>
  43. </nabywca>
  44. <pozycja rodzaj="towar">
  45. <nazwa>okno dachowe</nazwa>
  46. <ilosc jm="szt">172</ilosc>
  47. <cenajednostkowa waluta="PLN">420</cenajednostkowa>
  48. <stawkaVAT>7</stawkaVAT>
  49. </pozycja>
  50. <pozycja rodzaj="towar">
  51. <nazwa>farba emulsyjna</nazwa>
  52. <ilosc jm="l">47</ilosc>
  53. <cenajednostkowa waluta="PLN">35.20</cenajednostkowa>
  54. <stawkaVAT>22</stawkaVAT>
  55. </pozycja>
  56. <pozycja rodzaj="usługa">
  57. <nazwa>transport</nazwa>
  58. <ilosc jm="szt">1</ilosc>
  59. <cenajednostkowa waluta="PLN">950</cenajednostkowa>
  60. <stawkaVAT>zw</stawkaVAT>
  61. </pozycja>
  62. <pozycja rodzaj="usługa">
  63. <nazwa>malowanie ścian zewnętrznych</nazwa>
  64. <ilosc jm="m2">140</ilosc>
  65. <cenajednostkowa waluta="PLN">37.20</cenajednostkowa>
  66. <stawkaVAT>7</stawkaVAT>
  67. </pozycja>
  68. <pozycja rodzaj="towar">
  69. <nazwa>listwy wykończeniowe ozdobne</nazwa>
  70. <ilosc jm="szt">17</ilosc>
  71. <cenajednostkowa waluta="PLN">21</cenajednostkowa>
  72. <stawkaVAT>22</stawkaVAT>
  73. </pozycja>
  74. <pozycja rodzaj="towar">
  75. <nazwa>ekologiczny klej do tapet</nazwa>
  76. <ilosc jm="szt">8</ilosc>
  77. <cenajednostkowa waluta="PLN">47.2</cenajednostkowa>
  78. <stawkaVAT>3</stawkaVAT>
  79. </pozycja>
  80. </faktura>
  81. </faktury>


i do niego muszę utworzyć schemat który dla faktury 75/FV/2006 utworzy fakturę o tabelarycznym układzie w XML. Sam układ jest już zrobiony, jednak mam kilka problemów:

1) posortować wg. nazwy pozycji - kombinuje kombinuje i albo mi wyświetla bez sortowania, albo sortuje, leczy wyświetla w jednym wierszu, zamiast w kolumnie
2) ustawić żeby miejsca dziesiętne oddzielał przecinek, a nie kropka - niby też proste, ale użyłem wszelkich możliwych kombinacji i albo mi ustawia kropkę jako separator, albo przecinek przesuwa się o 2 miejsca (np. mam liczbę 420, przecinek zamiast dać liczbę 420,00 daje liczbę 4,20).
3) zsumować wartości netto, brutto, wartość podatku - używając funkcji (sum(ilosc*cena) krzyczy, że tak być nie może.

Oto kod XSL, mam nadzieję, że ktoś dla kogo to pikuś mi pomoże ;]:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0"
  3. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4. <xsl:output method="html" indent="yes" />
  5. <xsl:decimal-format name="pln" decimal-separator="," grouping-separator="."/>
  6. <xsl:variable name="cenaNetto">
  7. <xsl:value-of select="faktury/faktura[@nr='75/FV/2006']/pozycja/cenajednostkowa*faktury/faktura[@nr='75/FV/2006']/pozycja/ilosc"/>
  8. </xsl:variable>
  9. <xsl:template match="/">
  10. <html>
  11. <head>
  12. <title>Faktura VAT</title>
  13. <style type="text/css">
  14. body {
  15. font-family: Arial, Helvetica, sans-serif;
  16. font-size: 0px;
  17. color:white;
  18. }
  19. .sprzedawca {
  20. border: 0px solid #000000;
  21. text-align: justify;
  22. font-family: Arial, Helvetica, sans-serif;
  23. font-size: 14px;
  24. font-weight: normal;
  25. padding-top: 25px;
  26. padding-left: 10px;
  27. color: #666666;
  28. padding-bottom: 70px;
  29. }
  30. .table {
  31. width: 700px;
  32. }
  33. .danefaktury {
  34. border-bottom-style: solid;
  35. border-bottom-width: 1px;
  36. border-bottom-color: black;
  37. color:black;
  38. }
  39. h1 {
  40. margin: 0px;
  41. font-size: 25px;
  42. font-weight: bold;
  43. text-align: left;
  44. color: #FF6600;
  45. }
  46. .pozycje {
  47. border-style: solid;
  48. border-width: 0px 0px 1px 0px;
  49. border-color: black;
  50. font-size: 12px;
  51. color:black;
  52. padding:5px;
  53. }
  54. </style>
  55. </head>
  56. <body>
  57. <center>
  58. <table class="table" cellpadding="0" cellspacing="0">
  59. <xsl:apply-templates select="//faktura[@nr='75/FV/2006']"/>
  60. <tr>
  61. <td class="pozycje"></td>
  62. <td class="pozycje"></td>
  63. <td class="pozycje"></td>
  64. <td class="pozycje"><xsl:text>Razem:</xsl:text></td>
  65. <td class="pozycje"><xsl:value-of select="$cenaNetto"/></td>
  66. </tr>
  67. </table>
  68. </center>
  69. </body>
  70. </html>
  71.  
  72. </xsl:template>
  73. <xsl:template match="faktura">
  74. <tr>
  75. <td colspan="8" class="danefaktury">
  76. <h1>
  77. <xsl:text>Faktura VAT: </xsl:text>
  78. <xsl:value-of select="@nr"/>
  79. </h1>
  80. <xsl:text>Data wystawienia: </xsl:text>
  81. <xsl:value-of select="@datawystawienia"/>
  82. <xsl:text> Data sprzedaży: </xsl:text>
  83. <xsl:value-of select="@datasprzedazy"/>
  84. </td>
  85. </tr>
  86. <xsl:apply-templates/>
  87. </xsl:template>
  88. <xsl:template match="sprzedawca">
  89. <tr>
  90. <td colspan="4" class="sprzedawca">
  91. <strong><xsl:text>SPRZEDAWCA:</xsl:text></strong><br/>
  92. <strong><xsl:text>NIP: </xsl:text></strong><xsl:value-of select="@nip"/><br/>
  93. <xsl:apply-templates/>
  94. </td>
  95. <td colspan="4" class="sprzedawca">
  96. <strong><xsl:text>NABYWCA:</xsl:text></strong><br/>
  97. <strong><xsl:text>NIP: </xsl:text></strong><xsl:value-of select="../nabywca/@nip"/><br/>
  98. <xsl:apply-templates select="../nabywca"/>
  99. </td>
  100. </tr>
  101. </xsl:template>
  102. <xsl:template match="nabywca">
  103. <xsl:apply-templates/>
  104. </xsl:template>
  105. <xsl:template match="firma">
  106. <strong><xsl:text>Nazwa firmy: </xsl:text></strong>
  107. <xsl:value-of select="."/><br/>
  108. </xsl:template>
  109. <xsl:template match="adres">
  110. <strong><xsl:text>Adres: </xsl:text></strong>
  111. <xsl:value-of select="."/>
  112. </xsl:template>
  113. <xsl:template match="kod">
  114. <xsl:text>, </xsl:text>
  115. <xsl:value-of select="."/>
  116. </xsl:template>
  117. <xsl:template match="miejscowosc">
  118. <strong><xsl:text> </xsl:text></strong>
  119. <xsl:value-of select="."/>
  120. </xsl:template>
  121. <xsl:template match="pozycja">
  122. <xsl:choose>
  123. <xsl:when test=".=//pozycja[1]">
  124. <tr>
  125. <td class="pozycje"><strong><xsl:text>Pozycja:</xsl:text></strong></td>
  126. <td class="pozycje"><strong><xsl:text>Ilość:</xsl:text></strong></td>
  127. <td class="pozycje"><strong><xsl:text>J.m.:</xsl:text></strong></td>
  128. <td class="pozycje"><strong><xsl:text>Cena J.:</xsl:text></strong></td>
  129. <td class="pozycje"><strong><xsl:text>Netto::</xsl:text></strong></td>
  130. <td class="pozycje"><strong><xsl:text>Brutto:</xsl:text></strong></td>
  131. <td class="pozycje"><strong><xsl:text>Wartość podatku:</xsl:text></strong></td>
  132. <td class="pozycje"><strong><xsl:text>VAT:</xsl:text></strong></td>
  133. </tr>
  134. <tr>
  135. <xsl:apply-templates/>
  136. </tr>
  137. </xsl:when>
  138. <xsl:otherwise>
  139. <tr>
  140. <xsl:apply-templates/>
  141. </tr>
  142. </xsl:otherwise>
  143. </xsl:choose>
  144. </xsl:template>
  145. <xsl:template match="nazwa">
  146. <td class="pozycje">
  147. <xsl:number count="pozycja" format="1. "/>
  148. <xsl:value-of select="."/>
  149. </td>
  150. </xsl:template>
  151. <xsl:template match="ilosc">
  152. <td class="pozycje">
  153. <xsl:value-of select="."/>
  154. </td>
  155. <td class="pozycje">
  156. <xsl:value-of select="@jm"/>
  157. </td>
  158. </xsl:template>
  159. <xsl:template match="cenajednostkowa">
  160. <td class="pozycje">
  161. <xsl:value-of select="format-number(.,'#.00')"/>
  162. </td>
  163. <td class="pozycje">
  164. <xsl:value-of select="format-number(.*../ilosc,'#.00')"/>
  165. </td>
  166. <xsl:choose>
  167. <xsl:when test="../stawkaVAT !='zw' and ../stawkaVAT !=0">
  168. <td class="pozycje">
  169. <strong><xsl:value-of select="format-number(.*../ilosc*(1+(../stawkaVAT div 100)),'#.00')"/></strong>
  170. </td>
  171. <td class="pozycje">
  172. <xsl:value-of select="format-number(.*(../stawkaVAT div 100)*../ilosc,'#.00')"/>
  173. </td>
  174. </xsl:when>
  175. <xsl:otherwise>
  176. <td class="pozycje">
  177. <strong><xsl:value-of select="format-number(.*../ilosc,'#.00')"/></strong>
  178. </td>
  179. <td class="pozycje">
  180. <xsl:value-of select="0.00"/>
  181. </td>
  182. </xsl:otherwise>
  183. </xsl:choose>
  184. </xsl:template>
  185. <xsl:template match="stawkaVAT">
  186. <td class="pozycje">
  187. <xsl:value-of select="."/>
  188. </td>
  189. </xsl:template>
  190. </xsl:stylesheet>
Cezar708
proponuję przeczytać następujące artykuły:

* http://www.xml.com/pub/a/2001/05/07/xsltmath.html

jak nie-angielski jesteś to wywnioskujesz na podstawie przykładów

Pozdrawiam
Cezar708
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.