Autor Zpráva
Acer1968
Profil
Ahojky. Nějak jsem se v tom ztratil, tak doufám, že mně někdo postrčí.

Mám vstupní XML soubor a v něm element:

<VASECENA>414,60</VASECENA>

Upozorňuji na tu desetinnou čárku, nikoli tečku.

Potřebuji porovnat tuhle cenu s určitými fixními hladinami a podle toho nastavit procenta marže a ve výstupním XML uložit do elementu <PRICE>. Moje představa byla ve smyslu:

<PRICE>
<xsl:choose>
<xsl:when test="VASECENA &gt; 100">
<xsl:value-of select="VASECENA * 1,1 * 1,19">
</xsl:when>
<xsl:when test="VASECENA &lt; 100 AND VASECENA &gt; 500">
<xsl:value-of select="VASECENA * 1,08 * 1,19">
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="VASECENA * 1,05 * 1,19">
</xsl:otherwise>
</xsl:choose>
</PRICE>

Jinými slovy, z ceny nákupní bez DPH potřebuju udělat ceny s DPH a ještě navíc různě nastavit marži podle cenových hladin.

Problém mi dělá jak ta desetinná čárka, tak asi i ty podmínky. Ale nevím, kde dělám chybu.

Díky za nakopnutí.
quinux
Profil
Acer1968
No máš tam celkem hodně chyb :)
1) předpokládám, že první podmínka má být VASECENA je menší než 100 což znamená VASECENA &lt; 100 ( menší než &lt; - větší než &gt;)
2) když testuješ více podmínek, tak je uzavírej do závorky, tedy (VASECENA &lt; 100) AND (VASECENA &gt; 500)
3) value-of nemáš uzavřen <xsl:value-of select="VASECENA * 1,08 * 1,19"/>

Takže výsledek bych viděl asi takto:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" />
	<xsl:decimal-format decimal-separator="," grouping-separator=" "/>

	<xsl:template match="/">
		<xsl:variable name="Cena" select="translate(VASECENA,',','.')"/>
		
		<xsl:variable name="VyslednaCena">
			<xsl:choose>
				<xsl:when test="$Cena &lt; '100'">
					<xsl:value-of select="$Cena * '1.1' * '1.19'"/>
				</xsl:when>
				<xsl:when test="($Cena &gt; '100') and ($Cena &lt; '500')">
					<xsl:value-of select="$Cena * '1.08' * '1.19'"/>
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of select="$Cena * '1.05' * '1.19'"/>
				</xsl:otherwise>
			</xsl:choose> 
		</xsl:variable>
		
		<xsl:value-of select="format-number($VyslednaCena,'# ##0,00')"/>
	</xsl:template>
</xsl:stylesheet>


Možná to bude chtít ještě trochu doladit podle tvých potřeb, ale to už snad zvládneš ;)
Acer1968
Profil
To quinux

ad 1) jasně, to byl úklep, v originále mám složitější podmínku, kterou jsem tam nechtěl rozpatlávat, tam mám menší a větší dobře, ale je dobře, žes to tady zmínil, poměrně nedávno jsem strávil spoustu času tím, než jsem přišel na to, že to musím psát pomocí literálů, snad to tedy někomu pomůže, opakování matka moudrosti
ad 2) to je výtečná rada, protože mi nebylo jasné, proč mi to píše pořád chybu před AND, teď už je to jasné
ad 3) opět překlepa chyba při kopírování, ale když už to tu probíráme, zeptám se, jak moc důležitá je mezera před /> protože já se jí u elementů/tagů, které nemají vlastní tělo, snažím důsledně psát a tady vidím, že je to zřejmě zbytečné (ale mně se pak uzavírací závorka lépe hledá, tak proto)

K Tvému kódu. Úžasné, díky moc, je to funkční, což mně, absolutního amatéra (ten XSLT soubor vytvářím proti své vůli a víceméně z nutnosti - i když poslední dobou už i z vlatního zájmu, protože jsem se díky tomu začal o XML a XSLT zajímat) musí naplňovat obdivem ke každému, kdo to umí líp než já (což zas není tak složité být lepší než já).

Vůbec mně nenapadlo řešit to přes proměnné, protože v mém amatérském vnímání je i VASECENA víceméně proměnná a proto jsem se snažil to všechno dělat právě přes jméno elementu.

V knize kterou mám je spojitost mezi xsl:decimal-format a format-number zmíněna jen velmi vágně a proto jsem se zamotal do různých pokusů s převodem pomocí number atd. a to byla nekonečná cesta pokusů a omylů.

Ještě bych se zeptal, jak zařídit, aby platnost proměnných Cena a VyslednaCena byla "globální", tím chci říct i mimo element, v jehož těle je definuju. Příklad (s kódem od Tebe, ještě jednou díky moc):

<PRICE>
<xsl:variable name="Cena" select="translate(VASECENA,',','.')"/>

<xsl:variable name="VyslednaCena">
<xsl:choose>
<xsl:when test="$Cena &lt; '100'">
<xsl:value-of select="$Cena * '1.1' * '1.19'"/>
</xsl:when>
<xsl:when test="($Cena &gt; '100') and ($Cena &lt; '500')">
<xsl:value-of select="$Cena * '1.08' * '1.19'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$Cena * '1.05' * '1.19'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:value-of select="format-number($VyslednaCena,'###0,00')"/>
</PRICE>
<PRICE_WITHOUT_VAT>
<xsl:value-of select="$VyslednaCena div '1.19'"/>
</PRICE_WITHOUT_VAT>

Teď prosím nekoukejte na "nelogičnost" příkladu (proč napřed počítat cenu s daní a pak teprve bez daně), jen jsem chtěl ozřejmit, o co mi jde, a sice o platnost té proměnné $VyslednaCena, protože já chápu, že je mimo oblast své platnosti, jen neznám mechanismus, jak z ní udělat "globální"...

Odpusťte začátečníkovi, připadám si jako Dalibor, jen ty housle jsem vyměnil za mocnější nástroj..

Díky

Acer
quinux
Profil
Acer1968
3) myslím, že mezera mezi attributem a uzavíracím lomítkem není potřeba (funguje to v obou případech) a jestli je to správně podle specifikace to ti neřeknu


Co se týče proměnných, tak je imho lepší využít proměnných, protože každý dotaz na VASECENA znamená dotaz do databáze resp. XML souboru (příp. do "něčeho" kde to je umístěno). Kdežto proměnné jsou zpracovávány rovnou v dané transformaci, takže by to mělo být i rychlejší na zpracování.
- ale teď nejspíše plácám, taky nejsem v XSLT guru :-D

Globální proměnné v XSLT tuším nejdou a nebo jsem je ještě nikdy nepotřeboval tak jsem to ani nezjišťoval ;)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: