funkcje matematyczne w XSL dla XML

0

witam.
od niedawna muszę opanować podstawy tworzenia sterowników dla plików XML. do niedawna szło nieźle, ale trafiłem na zaporę i od kilku godzin nie mogę znaleźć rozwiązania.

plik źródłowy wygląda następująco (XML - wycinek):

<?xml version="1.0" encoding="UTF-8"?>
<produkty data="29-07-2016 12:24:14">
    <produkt>
        <numer>71439</numer>
        <cena_netto>378,86</cena_netto>
        <cena_brutto>466,00</cena_brutto>
        <waluta>PLN</waluta>
        </produkt>
</produkty>

potrzebuję tutaj wykonać za pomocą sterownika operację zmiany ceny netto i brutto o +80.
niestety ale wszystkie sposoby które testowałem kończą informacją "NaN".

powiem że już mi ręce opadają. już robiłem operacje matematyczne ale na innym pliku, inaczej formatowanym i tam wszystko szło bez problemu, natomiast tutaj już nie mam siły. powiem tylko że muszę to zrobić na 2500 pozycjach i sterownik niezbędny.

widok ostatniej próby:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="/">
        <produkty>
            <xsl:for-each select="produkty/produkt">
            <produkty>
<kod_producenta>
<xsl:value-of select="numer"/>
</kod_producenta>

<cena_brutto>
<xsl:value-of select="cena_brutto"/>
</cena_brutto>

<cena_up>
<xsl:value-of select="format-number (cena_brutto + 80,'###,###.#')"/>
</cena_up>

</produkty>     
            </xsl:for-each>
        </produkty>
    </xsl:template>
</xsl:stylesheet>

bardzo proszę o pomoc w rozwiązaniu problemu :(

0

Tak jak tutaj nie działa?

<cena_up>
<xsl:value-of select="(cena_brutto + 80)"/>
</cena_up>

O ile dobrze pamiętam jeśli cena_brutto jest liczbą, to nie potrzebujesz jej dodatkowo format-number traktować.

0

no właśnie nie działa i już mi ręce opadają :(:(
nie wiem czy nie ma problemu z formatem znaków, ale własnie jeśli jest liczba??

no to chyba doszedłem..... miejsca dziesiętne rozdziela przecinek, a powinna być kropka i rozpoznaje jako tekst :( bo sprawdzałem na sumowaniu dla numeru i działa.

no to teraz jak można hurtowo naprawić taki błąd.????

1

Różne warianty (cena_up, cena_up2, cena_up3) rozwiązania problemu (testowane na http://www.online-toolz.com/tools/xslt-transformation.php)

<xsl:variable name="cb" select="translate(cena_brutto, ',', '.')" /> 
<cena_up>
<xsl:value-of select="format-number(number($cb) + 80,'###,###.#')"/>
</cena_up>
<cena_up2>
<xsl:value-of select="number($cb) + 80"/>
</cena_up2>
<cena_up3>
<xsl:value-of select="format-number(number(translate(cena_brutto, ',', '.')) + 80,'###,###.#')"/>
</cena_up3>

daje w wyniku

<?xml version="1.0"?>
<produkty><produkty><kod_producenta>71439</kod_producenta><cena_brutto>466,00</cena_brutto><cena_up>546</cena_up><cena_up2>546</cena_up2><cena_up3>546</cena_up3></produkty></produkty>
0

jesteś wielki.
działa jak należy.
gdzieś po drodze zmagań trafiłem na funkcję translate, ale musiałem coś sknocić i nie banglało.

przy okazji trafiłem na narzędzie do zmiany znaków obiektowo przy pomocy Altova MapForce, również mi zadziałało już co prawda po twojej odpowiedzi.

jednak Twoja forma jest praktyczniejsza. Jednak w załączniku dla ciekawych daję przykład jak to zrobić przy wykorzystaniu MapForce.

pozdrawiam
i jeszcze raz dziekuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0