<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="tranformacja.xsl"?> <faktura nr="234/2006" datawystawienia="2006-10-24" datasprzedazy="2006-10-24"> <sprzedawca nip="677-15-91-304"> <firma>Marpol sp. z o.o.</firma> <adres>ul. Bajeczna 15</adres> <kod>32-097</kod> <miejscowosc>Kraków</miejscowosc> </sprzedawca> <nabywca nip="677-15-91-304"> <nazwisko>Wójtowicz</nazwisko> <imie>Łukasz</imie> <adres>Al.Niepodległości 109</adres> <kod>00-912</kod> <miejscowosc>Warszawa</miejscowosc> </nabywca> <pozycja rodzaj="towar"> <nazwa>cegła pełna</nazwa> <ilosc jm="szt">12600</ilosc> <cenajednostkowa waluta="PLN">0.26</cenajednostkowa> <stawkaVAT>22</stawkaVAT> </pozycja> <pozycja rodzaj="towar"> <nazwa>cement</nazwa> <ilosc jm="kg">1420</ilosc> <cenajednostkowa waluta="PLN">3.50</cenajednostkowa> <stawkaVAT>7</stawkaVAT> </pozycja> </faktura> <faktura nr="75/FV/2006" datawystawienia="2006-08-07" datasprzedazy="2006-08-12"> <sprzedawca nip="821-00-21-777"> <firma>Rowenta</firma> <adres>ul. Kurczaby 394</adres> <kod>41-220</kod> <miejscowosc>Żyrardów</miejscowosc> </sprzedawca> <nabywca nip="223-77-12-567"> <firma>Budopol S.A.</firma> <adres>ul. Olszaniecka 3</adres> <kod>12-201</kod> <miejscowosc>Zielona Góra</miejscowosc> </nabywca> <pozycja rodzaj="towar"> <nazwa>okno dachowe</nazwa> <ilosc jm="szt">172</ilosc> <cenajednostkowa waluta="PLN">420</cenajednostkowa> <stawkaVAT>7</stawkaVAT> </pozycja> <pozycja rodzaj="towar"> <nazwa>farba emulsyjna</nazwa> <ilosc jm="l">47</ilosc> <cenajednostkowa waluta="PLN">35.20</cenajednostkowa> <stawkaVAT>22</stawkaVAT> </pozycja> <pozycja rodzaj="usługa"> <nazwa>transport</nazwa> <ilosc jm="szt">1</ilosc> <cenajednostkowa waluta="PLN">950</cenajednostkowa> <stawkaVAT>zw</stawkaVAT> </pozycja> <pozycja rodzaj="usługa"> <nazwa>malowanie ścian zewnętrznych</nazwa> <ilosc jm="m2">140</ilosc> <cenajednostkowa waluta="PLN">37.20</cenajednostkowa> <stawkaVAT>7</stawkaVAT> </pozycja> <pozycja rodzaj="towar"> <nazwa>listwy wykończeniowe ozdobne</nazwa> <ilosc jm="szt">17</ilosc> <cenajednostkowa waluta="PLN">21</cenajednostkowa> <stawkaVAT>22</stawkaVAT> </pozycja> <pozycja rodzaj="towar"> <nazwa>ekologiczny klej do tapet</nazwa> <ilosc jm="szt">8</ilosc> <cenajednostkowa waluta="PLN">47.2</cenajednostkowa> <stawkaVAT>3</stawkaVAT> </pozycja> </faktura> </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 ;]:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes" /> <xsl:decimal-format name="pln" decimal-separator="," grouping-separator="."/> <xsl:variable name="cenaNetto"> <xsl:value-of select="faktury/faktura[@nr='75/FV/2006']/pozycja/cenajednostkowa*faktury/faktura[@nr='75/FV/2006']/pozycja/ilosc"/> </xsl:variable> <xsl:template match="/"> <html> <head> <title>Faktura VAT</title> <style type="text/css"> body { font-family: Arial, Helvetica, sans-serif; font-size: 0px; color:white; } .sprzedawca { border: 0px solid #000000; text-align: justify; font-family: Arial, Helvetica, sans-serif; font-size: 14px; font-weight: normal; padding-top: 25px; padding-left: 10px; color: #666666; padding-bottom: 70px; } .table { width: 700px; } .danefaktury { border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: black; color:black; } h1 { margin: 0px; font-size: 25px; font-weight: bold; text-align: left; color: #FF6600; } .pozycje { border-style: solid; border-width: 0px 0px 1px 0px; border-color: black; font-size: 12px; color:black; padding:5px; } </style> </head> <body> <center> <table class="table" cellpadding="0" cellspacing="0"> <xsl:apply-templates select="//faktura[@nr='75/FV/2006']"/> <tr> <td class="pozycje"></td> <td class="pozycje"></td> <td class="pozycje"></td> <td class="pozycje"><xsl:text>Razem:</xsl:text></td> <td class="pozycje"><xsl:value-of select="$cenaNetto"/></td> </tr> </table> </center> </body> </html> </xsl:template> <xsl:template match="faktura"> <tr> <td colspan="8" class="danefaktury"> <h1> <xsl:text>Faktura VAT: </xsl:text> <xsl:value-of select="@nr"/> </h1> <xsl:text>Data wystawienia: </xsl:text> <xsl:value-of select="@datawystawienia"/> <xsl:text> Data sprzedaży: </xsl:text> <xsl:value-of select="@datasprzedazy"/> </td> </tr> <xsl:apply-templates/> </xsl:template> <xsl:template match="sprzedawca"> <tr> <td colspan="4" class="sprzedawca"> <strong><xsl:text>SPRZEDAWCA:</xsl:text></strong><br/> <strong><xsl:text>NIP: </xsl:text></strong><xsl:value-of select="@nip"/><br/> <xsl:apply-templates/> </td> <td colspan="4" class="sprzedawca"> <strong><xsl:text>NABYWCA:</xsl:text></strong><br/> <strong><xsl:text>NIP: </xsl:text></strong><xsl:value-of select="../nabywca/@nip"/><br/> <xsl:apply-templates select="../nabywca"/> </td> </tr> </xsl:template> <xsl:template match="nabywca"> <xsl:apply-templates/> </xsl:template> <xsl:template match="firma"> <strong><xsl:text>Nazwa firmy: </xsl:text></strong> <xsl:value-of select="."/><br/> </xsl:template> <xsl:template match="adres"> <strong><xsl:text>Adres: </xsl:text></strong> <xsl:value-of select="."/> </xsl:template> <xsl:template match="kod"> <xsl:text>, </xsl:text> <xsl:value-of select="."/> </xsl:template> <xsl:template match="miejscowosc"> <strong><xsl:text> </xsl:text></strong> <xsl:value-of select="."/> </xsl:template> <xsl:template match="pozycja"> <xsl:choose> <xsl:when test=".=//pozycja[1]"> <tr> <td class="pozycje"><strong><xsl:text>Pozycja:</xsl:text></strong></td> <td class="pozycje"><strong><xsl:text>Ilość:</xsl:text></strong></td> <td class="pozycje"><strong><xsl:text>J.m.:</xsl:text></strong></td> <td class="pozycje"><strong><xsl:text>Cena J.:</xsl:text></strong></td> <td class="pozycje"><strong><xsl:text>Netto::</xsl:text></strong></td> <td class="pozycje"><strong><xsl:text>Brutto:</xsl:text></strong></td> <td class="pozycje"><strong><xsl:text>Wartość podatku:</xsl:text></strong></td> <td class="pozycje"><strong><xsl:text>VAT:</xsl:text></strong></td> </tr> <tr> <xsl:apply-templates/> </tr> </xsl:when> <xsl:otherwise> <tr> <xsl:apply-templates/> </tr> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="nazwa"> <td class="pozycje"> <xsl:number count="pozycja" format="1. "/> <xsl:value-of select="."/> </td> </xsl:template> <xsl:template match="ilosc"> <td class="pozycje"> <xsl:value-of select="."/> </td> <td class="pozycje"> <xsl:value-of select="@jm"/> </td> </xsl:template> <xsl:template match="cenajednostkowa"> <td class="pozycje"> <xsl:value-of select="format-number(.,'#.00')"/> </td> <td class="pozycje"> <xsl:value-of select="format-number(.*../ilosc,'#.00')"/> </td> <xsl:choose> <xsl:when test="../stawkaVAT !='zw' and ../stawkaVAT !=0"> <td class="pozycje"> <strong><xsl:value-of select="format-number(.*../ilosc*(1+(../stawkaVAT div 100)),'#.00')"/></strong> </td> <td class="pozycje"> <xsl:value-of select="format-number(.*(../stawkaVAT div 100)*../ilosc,'#.00')"/> </td> </xsl:when> <xsl:otherwise> <td class="pozycje"> <strong><xsl:value-of select="format-number(.*../ilosc,'#.00')"/></strong> </td> <td class="pozycje"> <xsl:value-of select="0.00"/> </td> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="stawkaVAT"> <td class="pozycje"> <xsl:value-of select="."/> </td> </xsl:template> </xsl:stylesheet>