Toon posts:

[XSL] Combinatie van sum() en vermenigvuldigen

Pagina: 1
Acties:
  • 255 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
gegeven de volgende (versimpelde) xml-info:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<order>
  <products>
    <product>
    <name/>
    <quantity/>
    <price/>
    </product>
    <product>
    <name/>
    <quantity/>
    <price/>
    </product>
  </products>
</order>

dit geeft een order weer met producten, de prijs ervan en het bestelde aantal per product. Nu wil ik mbv xsl de totale kostprijs berekenen:

<xsl:value-of select="sum(product/price)"/> geeft de totale som van de prijzen van alle producten afzonderlijk (zonder de quantity mee te berekenen. Maar hoe bereken ik de som van het product van price en quantity?

<xsl:value-of select="sum(product/price*product/quantity)"/> werkt uiteraard niet..

Zie even zo snel niet hoe het wel zou moeten

Verwijderd

kweenie zeker ik vind xsl om te :r :D
maar zo zou misschien kunnen werken:
select="sum((select='product/price')*(select='product/quantity'))"

Verwijderd

Topicstarter
nup...

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Dat gaat niet lukken zonder het gebruik van extensions denk ik...

Dat lijkt best wel ruk, waarom is dat zo? Je zou wellicht denken dat je het volgende kunt doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
    <xsl:output method="xml" encoding="utf-8"/>
          
    <xsl:template match="order">

      <xsl:variable name="prices">
        <xsl:for-each select="products/product">
             <xsl:value-of select="quantity * price"/>
        </xsl:for-each>
      </xsl:variable>

      <result>
        <xsl:value-of select="sum( $prices )"/>
      </result>

    </xsl:template>
</xsl:transform>

Maar helaas gaat dit ook niet goed.

Dit komt allemaal door de opzet van XSLT: output = output. Je kunt in XSLT nooit een transformatie uitvoeren op het resultaat van een andere transformatie. Dat is een hele vervelende beperking die gelijk een markt creeert voor krachtigere transformatie-talen.

De variabele $prices is hierboven een result tree fragement en daar mag je vrijwel niets mee (behalve outputten) ;) .

Je kunt dus wel zelf een eigen extension schrijven die een deel van dit probleem voor je oplost. Probleem is dan wel dat je natuurlijk het liefst compatible wilt blijven met zoveel mogelijk engines...

Overigens: ik kan het natuurlijk mis hebben, dus al iemand anders wel een oplossing weet hoor ik hem graag :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
dat suckt ;(

Enig idee of hier betere ondersteuning voor komt in xsl versie 2.0?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
XPath 2.0 vaagt je probleem volledig weg :+ .

Je zou daar denk ik wat kunnen doen met een sum over een for-expressie. Ik heb me echter nog niet echt verdiept in XPath 2.0, dus het kan zijn dat ik dat verkeerd zie :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
KoekenBoes: Enig idee of hier betere ondersteuning voor komt in xsl versie 2.0?
Overigens zal je daar nog steeds geen transformaties over result-trees kunnen doen (en dat zal ook wel nooit komen ook). Het is gewoon een flinke uitbreiding van de uitdrukkingsmogelijkheden van XPath....
(voor zover ik het goed zie... Ik moet even flink onder voorbehoud praten omdat ik het nog niet echt serieus heb doorgenomen ;) )

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Ik geef toe, niet de mooiste oplossing :) Maar dit werkt wel (geloof ik ;)):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<xsl:template match="products">
  <xsl:call-template name="calc"/>
</xsl:template>
  
<xsl:template name="calc">
  <xsl:param name="number">0</xsl:param>
  <xsl:param name="total">0</xsl:param>
        
  <xsl:choose>
    <xsl:when test="$number &lt; count(product)">
    <xsl:call-template name="calc">
      <xsl:with-param name="total">
        <xsl:value-of select="$total + product[position() = $number + 1]/price * product[position() = $number + 1]/quantity"/>
      </xsl:with-param>
      <xsl:with-param name="number">
        <xsl:value-of select="$number + 1"/>
      </xsl:with-param>
    </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="$total"/><br/>
    </xsl:otherwise>
  </xsl:choose> 
        
</xsl:template>

[edit]
zo werkt ie goed

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum, tuurlijk ja |:( :D . Slim gevonden :) .

Maar inderdaad... dat is niet echt XSLT stijl. Het is wel een aardige work-around uiteraard :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je moet trouwens nog wel ff een position verwerken :o . Deze werkt niet goed...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op woensdag 20 februari 2002 15:57 schreef mbravenboer het volgende:
Hum, tuurlijk ja |:( :D . Slim gevonden :) .
Dank je :) Maar hij werkt nog niet helemaal :( Bij het voorbeeld dat ik gebruikte kwam het toevallig goed uit, maar hij pakt steeds de eerste node ipv steeds de volgende. Weet jij misschien een oplossing daarvoor?

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op woensdag 20 februari 2002 16:01 schreef mbravenboer het volgende:
Je moet trouwens nog wel ff een position verwerken :o .
Oh ja, natuurlijk :) [position() = $number + 1] :) Ik zal het ff editen...

Verwijderd

Topicstarter
recursieve xslt: geweldig :)

bedankt voor dit stukje code, maar ik denk dat ik de totale prijs maar in m'n xml verwerk en de calculatie aan vb overlaat...

ffkes wachten op xpath v2

offtopic:
mbravenboer: enig idee of er ooit gematch zal kunnen worden op text-patterns in xslt? zodat je bijv ": )" kan omzetten naar een plaatje?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Zo werkt hij hier goed:

Je moet nu ff bij 1 beginnen ;) .
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0"?>

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
    <xsl:output method="xml" encoding="utf-8"/>

    <xsl:template match="products">
      <result>
        <xsl:call-template name="calc"/>
      </result>
    </xsl:template>
  
    <xsl:template name="calc">
      <xsl:param name="number">1</xsl:param>
      <xsl:param name="total">0</xsl:param>
        
      <xsl:choose>
        <xsl:when test="$number &lt;= count(product)">
            <xsl:call-template name="calc">
              <xsl:with-param name="total">
                <xsl:value-of select="$total + product[position() = $number]/price * product[position() = $number]/quantity"/>
              </xsl:with-param>

              <xsl:with-param name="number">
                <xsl:value-of select="$number + 1"/>
              </xsl:with-param>
            </xsl:call-template>
        </xsl:when>

        <xsl:otherwise>
            <xsl:value-of select="$total"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
</xsl:transform>

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op woensdag 20 februari 2002 16:13 schreef mbravenboer het volgende:
Je moet nu ff bij 1 beginnen ;) .
Zo kan het ook ja :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
marcusk: Ik zal het ff editen...
Hum, ik was ook al bezig zoals je ziet ;) .
enig idee of er ooit gematch zal kunnen worden op text-patterns in xslt? zodat je bijv ": )" kan omzetten naar een plaatje?
Dat kan je wel op je buik schrijven (gelukkig). Dit zou de hele natuur van XSLT ernstig schaden en de taal veel te complex maken... Uiteraard is het wel een makkelijker feature voor posts, maar ja... daar ligt niet bepaald het interessantste toepassingsgebied van XML ;) .

Kijk trouwens eens hier ;)
http://www.pandoramix.org/PostingML/

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
het was toevallig een voorbeeldje dat met posts te maken had, maar je zou eventueel ook een reg-ex als voorbeeld kunnen stellen
code:
1
2
3
<xsl:template match="node/text()" pattern="[0-9]{3}">
  a number <xsl:pattern-match select="1"/>
</xsl>

oid

waarom zou dit de natuur van xstl (zoals jij dat zegt) ernstig schaden? Zolang ervoor gezorgd wordt dat dit soort expressies alleen op text matcht (niet op tags) zou dit mi een goede aanvulling zijn en de taal nog krachtiger maken

postingml had ik al eens bekeken ja :), leuke toepassing van xslt, alleen een smilie als tag schrijft niet echt lekker weg ;)

Verwijderd

Topicstarter
kan trouwens nergens de spec van xpath 2.0 vinden... Linkje?

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
met die smilies...

je zou toch value-of select="translate(text(), ':)', '[img]\'smile.gif\'/[/img]') o.i.d. kunnen gebruiken? (Mits escapen werkt)

Maarja... das niet echt handig met meerdere smilies natuurlijk :)

Verwijderd

Topicstarter
zou kunnen :) Nooit naar gekeken eigenlijk... Maar die smilie was maar even een snel voorbeeld; Het ging me voornamelijk om ingewikkelde regex-jes

toch zou dit lekkerder werken mi:
code:
1
2
3
<xsl:template match="node/text()" pattern=":)">
  [img]"http://domain/to/smilie.gif"[/img]
</xsl:template>

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik zei dat ik dit geen fraaie feature vinden omdat het idee van een transformatie taal voor [b]XML]/b] dan verloren gaat. XSLT is geen general-purpose transformatie taal voor XML, laat staat een general-purpose transformatie taal.

Op zich ziet jouw voorbeeld er wel aardig uit, maar er zijn een aantal problemen:

1) (Met stip) Het gaat tegen de visie van XML in: structuur in XML-tags is niet relevant (beter gezegd: zou niet relevant mogen zijn). Op deze manier support je transformaties op iets wat helemaal niet relevant is voor XML: patronen in tekst. De eenvoud van XSLT en de structuur van XML wordt hiermee aangetast...

2) Wat worden nodes? Je gaat nu matchen op structuur in een text-node. Moeten daarvoor nieuwe nodes aangemaakt worden? Het is in ieder geval noodzakelijk dat er een consequent gebruik van nodes blijft :) .

3) Het kan een erg dure operatie worden als je niet selectief bent op XPaths: als je elke text node door een regex gaat halen is dat niet echt fantastisch.

Er zijn vast nog wel meer punten, maar eigenlijk voldoet alleen punt 1 al :) . Ik denk dat het voorbij de scope van XSLT gaat... Er verschijnen steeds meer transformatie-talen in het XML stijd-toneel en ik denk dat dit meer iets is voor een zeer algemene transformatie taal ( Stratego 8-) ).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Omdat ik toevallig toch met XML en Stratego bezig was heb ik nog even een implementatie in Stratego gemaakt 8-) .
code:
1
2
3
4
5
6
7
8
strategies
    main = iowrap( calc )

    calc = collect(?Product(_,_)); map(Calc-Price); sum
rules
    Calc-Price:
      Product(Quantity(x), Price(y)) -> result
        where <mul> (x,y) => result

Stratego is cool *D .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

mbravenboer:.. Stratego ..
Patser :+

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
Op woensdag 20 februari 2002 17:12 onderbouwde mbravenboer zijn stelling met een heel verhaal:
...
Shit, kan er weinig tegening brengen :o

Stratego heb ik ook bekeken, ziet er inderdaad geinig uit :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Wauw, das een schop ;) . Ik wist dat er ergens een topic was met een discussie over reguliere expressies in XSLT ;) .

Ik las net op de xml-dev mailing-list een post van Micheal Kay, lid van de W3C Working Group die zich bezich houdt met XSLT 2.0. Uit zijn post bleek dat er wel degelijk gedacht wordt aan text-manipulatie met reguliere expressies. Dit niet zozeer omdat het uit formeel oogpunt een interessante toevoeging is, maar wel omdat de 'real-world' het nodig heeft.
Some of the problems are missing features which I think we can fix, and which I hope that XSLT 2.0 will fix. Grouping is an obvious example; we also hope to make progress on text manipulation (using regular expressions), though finding the right design is proving difficult.
Het staat ook kort genoemd bij de goals in de requirements voor XSLT 2.0, maar er is helaas geen uitgebreider item bij sectie 2: Requirements. Grouping komt daar overigens wel uitgebreid aan bod.

Op xml.com trouwens nog een leuk artikel over XPath 2.0.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Goh, jullie zijn wel blij met die reguliere-expressies ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
/me is blij :)

Ook al zit er wel wat in jouw bedenkingen tegen dit soort functionaliteit, zou het mi toch wel een hele handige toevoeging zijn.

Verwijderd

Topicstarter
er is hier trouwens niet meer over te vinden dan die mailinglist post die jij gelezen had en de korte vermelding in de goals?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik weet helaas geen andere bronnen nee. Ik volg de xml-dev mailing-list tegenwoordig aardig, maar ook daar is dit nog niet eerder bespreken. Misschien eens op de XSL mailing-list kijken....

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik heb nog even rondgekeken. In de working draft van XSLT 2.0 is in ieder geval niets te vinden. Wel staat er weer een korte opmerking in een appendix van XSLT 1.0.

Maar toen vond ik dit: de requirements van XPath 2.0 (requirement 3: Must Support String Matching Using Regular Expressions). Hier staat een wat langer verhaal en zowaar concrete voorbeelden. Kennelijk willen ze string-matching volledig onder XPath laten vallen (wordt leuk in XQuery :P ). Aangezien er 'Must' staat, zal het er dus ook wel inkomen. In de working draft van XPath 2.0 kon ik er echter nog niets over vinden.

Nog een paar links waar kort iets in stond:
1. : "XSLT 2.0 is expected to support regular expressions through XPath 2.0"
2. : "XPath must integrate the regular expressions used by XML Schema"
3. " XSLT 2.0 Requirements - Regular Expressions?"

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Ik zat net al te denken ja dat ze het het beste gewoon in XPath kunnen implementeren. Daar zitten al meerdere string manipulatie-functies...

Vraag me nu alleen af hoe lang het zal duren voordat XPath en XSL 2.0 werkelijkheid gaat worden.

Bedankt voor je research in ieder geval :)

Verwijderd

Topicstarter
hmm.. ik zie bij die voorbeelden alleen maar match-voorbeelden staan. Ik hoop dat het manipuleren van strings dmv regexes ook mogelijk gaat worden

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Dat viel mij ook op ja (alleen matching). Ze spreken echter wel over String manipulatie, dus je zou zeggen dat je strings dan ook op moet kunnen delen....

XPath 2.0 begint echt een monster te worden (in de betekenis 'groot' van het woord). Vooral omdat er zorgvuldig nagedacht moet worden wat men in XPath 2.0 stopt (ivm met andere standaarden die XPath gebruiken zoals XQuery) gaat hier denk ik best wel behoorlijk wat tijd in zitten. XPath 2.0 is echt absoluut niet meer te vergelijken met de huidige XPath, de mogelijkheden zijn werkelijk enorm gegroeid (en ik kijk er met gemengde gevoelens naar).

XSLT 2.0 kan in principe vrij snel gerealiseerd worden omdat de uitbreidingen niet wereld-schokkend zijn. Grouping is naar mijn idee al aardig goed uitgewerkt in de working-draft. Ik ben eigenlijk wel benieuwd of er al gedurfde groepen bezig zijn met implementaties, want daar heb ik nog niets van gehoord... XPath 2.0 zal denk ik nog het meest remmend werken.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Het wordt inderdaad monsterlijk uitgebreid, maar gezien het feit dat het backwards-compatible zal zijn moet dit toch niet zoveel problemen opleveren? Wat je niet begrijpt moet je gewoon niet gebruiken ;)

Verwijderd

Topicstarter
Kan dit topic trouwens niet gesplitst worden naar 2 verschillende topics? We zijn op het moment aardig offtopic bezig heb ik het idee :D

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum tja, misschien had ik beter een nieuw topic kunnen beginnen :o . Het sloot hier zo goed op aan, vandaar...

Overigens is de combinatie van sum en vermenigvuldigen ook mogelijk in XPath 2.0, dus zo off-topic is het nog niet ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Op dinsdag 26 maart 2002 13:00 schreef mbravenboer het volgende:
Overigens is de combinatie van sum en vermenigvuldigen ook mogelijk in XPath 2.0, dus zo off-topic is het nog niet ;) .
haha, da's waar! Moet alleen wel nog een tijdje wachten ;(
Pagina: 1