[ sulja @ 18.09.2006. 14:35 ] @
kako naj jednostavnije da napravim u XSL-u brojac, najjednostavniji brojac, tipa br=br+1, da to bude neka promenljiva koju cu da inkrementujem i da koristim u daljem kodu ?

Unapred hvala
[ jablan @ 18.09.2006. 20:45 ] @
Nikako. XSL nije za to. XSL služi za transformisanje XML-a. Ako pri transformaciji XML-a imaš neki konkretan problem za koga smatraš da ima veze sa inkrementacijom promenljive, napiši o čemu se radi.
[ blaza @ 18.09.2006. 23:41 ] @
U XSL-u varijable su konstantne. Jednom definisana i inicijalizovana varijabla se ne moze menjati. Stoga moras pribeci triku. Brojaci se najlakse prave rekurzijom.
[ jablan @ 19.09.2006. 08:31 ] @
Citat:
blaza: U XSL-u varijable su konstantne.

Ovo nije tačno. Stvar je u tome da XSL nije imperativni jezik poput većine popularnih, tako da ne postoji klasična sekvenca izvršavanja. Tako i dodela vrednosti promenljive ne ide klasičnim putem, ali daleko od toga da je promenljiva u XSL-u konstantna (u tom slučaju ne bi se ni zvala promenljiva, zar ne?)...
[ blaza @ 19.09.2006. 14:08 ] @
Moze se reci da je varijabla konstantna, u smislu da joj se jednom dodeljena vrednost ne moze menjati, bez obzira na sam koncept XSL varijabli, ili nacin izvrsavanja XSLa.
[ sulja @ 19.09.2006. 15:19 ] @
OK, narode uspeo sam nekako da se snadjem.
TRebalo je da imam trensformaciju koja ce da generise nesto slicno kao drilldown, pa mi je trebalo da svaki generisani div tag ima jedinstveno ime a to sam mislio da uradim preko neke promenljive u XSL-u.
Inace XML koji se transformise se generise u aplikaciji koju sam pisao, tako da sam sad stavio da svaki od nodova koji treba da se transformise u DIV tag ima atribut ID ili NAME na osnovu koga se poziva JS funkcija nakon transformacije.

Nije bas mnogo lepo resenje ali radi.

U svakom slucaju puno vam hvala, tek sam poceo da radim sa XSL-om pa mi je svaka pomoc dobrodosla
[ jablan @ 19.09.2006. 15:28 ] @
Citat:
blaza: Moze se reci da je varijabla konstantna, u smislu da joj se jednom dodeljena vrednost ne moze menjati, bez obzira na sam koncept XSL varijabli, ili nacin izvrsavanja XSLa.

Sa stanovišta imperativnog programiranja možda, ali sa stanovišta matematike (i funkcionalnog programiranja, čiji je XSL predstavnik), potpuno je pogrešan (nepoznat) pojam "dodele" vrednosti promenljivoj. XSL promenljiva je "promenljiva" ne zato što joj se vrednost dodeljuje, već zato što njena vrednost u opštem slučaju nije unapred definisana, tj. konstantna.

Npr, u banalnom primeru:
Code:

<?xml version="1.0" encoding="utf-8" ?> 
<?xml-stylesheet type="text/xsl" href="XSLTFile1.xslt"?>
<a>
    <b>1<c>5</c></b>
    <b>7<c>6</c></b>
    <b>42<c>8</c></b>
</a>

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
        <xsl:apply-templates select="a/b" />
    </xsl:template>
    
    <xsl:template match="b">
        <xsl:variable name="v" select="c" />

        <xsl:value-of select="$v" /><br />
    </xsl:template>
</xsl:stylesheet>
 

Promenljiva v ima različitu vrednost u sve tri evaluacije drugog templejta. Dakle, njena vrednost nije konstantna, ali joj niko nikad eksplicitno ne "dodeljuje" vrednost.
[ blaza @ 19.09.2006. 16:40 ] @
Opet masis za 3 duzine. Globalna promenjiva unutar stylesheet-a i lokalna promenjiva unutar nekog parent elementa su konstantne zato sto im je vrednost nepromenjiva unutar scope-a, a ne zato sto im je na neki nacin unapred predodredjena konstantna vrednost. Kada izadjemo iz scope-a varijable - stylesheet-a ili parent elementa lokalne varijable, i ponovo udjemo u isti, varijabla moze poprimiti drugu vrednost, ali to obavezno ne mora biti unapred definisana konstantna vrednost, mada je i ovo moguce:
Code:
<xsl:variable name="boja" select="'liht roze'" />
Varijabla je konstantna (nepromenjiva), u smislu da ne postoji nacin za naknadnu promenu njene vrednosti unutar scope-a.
[ jablan @ 19.09.2006. 19:05 ] @
Šta to konkretno ja mašim za 3 dužine?!

Vidi, i ti i ja znamo kako stvar funkcioniše, ali ti uporno primenjuješ terminologiju imperativnog programiranja. Jednostavno, pojmovi poput dodele, unapred i naknadno, ovde ne funkcionišu, jer u XSL-u ne postoji sekvenca izvršavanja, kao ni komande kao u npr. C-u.

Ajd probaj da objasniš zašto se nešto zove promenljiva, ako nije promenljivo.
[ blaza @ 20.09.2006. 10:30 ] @
Uporno odbijaš da shvatiš u kom se konceptu koristi reč "konstantno" - nepromenjivo unutar scope-a.
Citat:
http://www.topxml.com/xsl/elmxsl_variable.asp
Element: xsl:variable Defines a variable with a value. A variable really is not variable, but constant.

Nuff said.
[ jablan @ 20.09.2006. 11:03 ] @
To je svakako zadovoljavajuće objašnjenje za nekog ko ne želi dublje da se upušta u teoriju...

Preciznije objašnjenje bi bilo ovo:
Citat:
> 2. If a variable cannot be changed after it has been assigned, why call it
> a variable? Ive read the reasoning behind this, and yes strictly it is a
> variable, but a more appropriate name would make sense.
>
> The above makes XSLT non-intuitive, and therefore harder to learn. Is there
> another language where you cannot change the value of a variable?

Lot's of languages -- e.g. any functional progaramming language or any declarative
programming language.

Yet another language is the language of mathematics, from which the term "variable"
originated.

A "variable" is used in mathematics to help capture/express some existing
relationship/law. As such it cannot be arbitrarily altered. For example:

x = x + 1

is never true for any x.

If z is defined as:

z = x * y

it would be dangerous and generally incorrect to change the value of z (or of x or
y), as this will generally break the above law (equation).

Imperative programming languages are based on the understanding that a system is
modelled as having a state and evolving from an initial state to a set of final
states. A variable is a store for a (component of a) state. As the state of the
system changes, so do the values of the variables, which together constitute the
state. This incorrect association of a variable with a store is typical for the
imperative programming model.

A very narrow context (,insufficient maths background and not knowing anything else
than the imperative programming model), will always produce incorrect understanding
of what a variable really is.


Da prevedem poslednju rečenicu, kao rezime cele priče:
Citat:
Vrlo uzak kontekst (nedovoljna matematička potkovanost i nepoznavanje bilo čega osim imperativnog modela programiranja), će uvek rezultirati netačnim razumevanjem toga šta promenljive zaista jesu.


http://sourceware.org/ml/xsl-list/2002-04/msg00324.html
[ blaza @ 20.09.2006. 14:42 ] @
Pretpostavljam da si hteo dati ovaj link: http://www.biglist.com/lists/x.../archives/200112/msg01050.html

U svakom slucaju, XSL skripta se sastoji od niza templejta, ciji redosled unutar xsl stylesheet-a nije bitan.
Medjutim, redosled instrukcija (citaj: uputstava xsl procesoru sta da radi, a ne kako da radi) unutar templejta je bitan, posto se templejt obradjuje sekvencijalno.
U suprotnom, ovakav kod bi se izvrsavao bez problema (koristicu tvoj primer u ovom postu):
Code:

<xsl:template match="b">
    <xsl:value-of select="$v" /><br />
    <xsl:variable name="v" select="c" />
</xsl:template>

Varijabla v nije vezana za svoj parent element, vec za leksicki scope, tj. deo parent elementa u kome je vidljiva.
Znaci, unutar parent elementa razlikujemo 2 dela: deo pre definicije varijable, i deo nakon definicije varijable, koji se zavrsava tagom koji zatvara parent element.
Stoga, unutar templejta pojmovi: unapred i naknadno, kao i sekvenca izvrsavanja (mada nije dobar termin) imaju smisao.
Kod pravih deklarativnih jezika, npr CSS, redosled instrukcija unutar templejta/pravila je potpuno nebitan.
E, sad, ja sve vreme pokusavam da kazem (mada nisam koristio pravu terminologiju, posto nisam imao mnogo dodirnih tacaka sa deklarativnim jezicima, i posto sam xslt, xPath i xsl-fo, samostalno savladao na brzaka, iz sumnjivih izbora, a sve u cilju izrade jednog projekta, i to davno),
da npr. ovakav kod nije moguc:
Code:

<xsl:template match="b">
    <xsl:variable name="v" select="c" />
    <xsl:value-of select="$v" /><br />
    <xsl:variable name="v" select="." />
    <xsl:value-of select="$v" /><br />
</xsl:template>

Zasto ovakav kod nije moguc?
Samo zbog dizajna XSL-a koji naginje ka tome da zadovolji nacela deklarativnih jezika, a ne zbog toga sto bi ovakav feature pored gazenja osnovnih nacela deklarativnih jezika i bacanja matematickih cistunaca u depresiju prouzrokovao dodatne probleme, koje u ovom trenutku nisam u stanju da primetim. Ili se varam?
[ Dragi Tata @ 20.09.2006. 15:09 ] @
Vas dvojica se u suštini razumete i slažete, a svađate se samo oko terminologije. Predlažem rešenje: http://www.defmacro.org/ramblings/fp.html

Citat:
In functional programming variables are simply aliases for expressions (so we don't have to type everything on one line). They cannot be modified. All variables can only be assigned to once. In Java terms this means that every single variable is declared as final (or const if we're dealing with C++). There are no non-final variables in FP.
[ jablan @ 20.09.2006. 15:15 ] @
Da, u pravu si za link...

Što se tiče prvog primera, tačno je da je promenljiva "vidljiva" samo "iza" njene deklaracije, ali moje je mišljenje da to nije zbog toga što to nameće "sekvenca izvršavanja" (iako tako nešto definitivno ne postoji, niti treba da postoji u deklarativnom jeziku), već što to nameće sekvenca parsiranja i evaluacije XSL-a.

Bilo kako bilo, mislim da je od izuzetnog značaja za ljude koji hoće da rade XSL shvatanje ogromne razlike od imperativnog načina razmišljanja. U tom smislu mi se ne sviđa korišćenje i primena pojmova koji su deklarativnom (matematičkom, generalno) načinu razmišljanja strani, poput sekvence izvršavanja, dodele, petlje itd.

Toplo preporučujem knjigu XSLT Michaela Kaya (Wrox), posebno poglavlje Programming without Assignment Statements koje upravo ima za cilj uvođenje čitaoca u ovakav način razmišljanja.
[ blaza @ 20.09.2006. 15:34 ] @
Citat:
jablan: Da, u pravu si za link...

Bar sam u necemu u pravu :P
Hvala za peporuku.