[XQuery] Kijken of een boek vaker dan 2 keer besteld wordt

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Ik zit al twee uren te proberen en te experimenteren met XSL, maar ik kom d'r echt niet uit. Ik denk dat ik XQuery blijkbaar niet goed begrijp, of dat er nog subtiele zaken in zitten die ik niet begrijp, maar hoe dan ook, ik kom d'r niet uit. (En ja, heb ook de moeder aller naslagwerken Google nagekeken, wel iets mee verder gekomen, maar niet veel).

Ik heb een XML zoals dit:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<root>
    <system>
        <BzCartShowContent>
            <bzwebshop>
                <booklist>
                    <book>
                        <ean>9789038893037</ean>
                        <title>Titaantjes</title>
                        <author>Nescio</author>
                        <qty>3</qty>
                        <price>12,50</price>
                        <totalprice>37,50</totalprice>
                        <pkey>517</pkey>
                        <extrafield1>24573</extrafield1>
                        <deliverytype>0</deliverytype>
                    </book>
                </booklist>
            </bzwebshop>
        </BzCartShowContent>
    </system>
</root>


Wat ik probeer te doen is de controleren op de 'qty' in de booklist. Als er één book in de booklist zit die een qty van meer dan 2 heeft, moet hij iets gaan doen (wat precies is niet zo belangrijk voor dit topic).

Daar XSL moeilijk doet met cijfers (dwz je kunt niet gewoon [qty > 2] doen), heb ik eerst een tussenoplossing gedaan - doe iets als er 3 boeken besteld worden:

XQuery:
1
count(/root/system/BzCartShowContent/bzwebshop/booklist/book[qty = '3']) > 0


Echter, dit lijkt niet te werken - hij lijkt altijd 'true' terug te geven in dit geval. Ook als ik van > 0 = 0 maak.

Ik kom d'r niet meer uit. Hebben jullie nog pointers? Zaken waar ik op moet letten? Mogelijke oorzaken van dit probleem? Fietsbellen?

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:59

Haan

dotnetter

Wat je nu volgens mij doet is zoeken op een attribute van book dat 'qty' heet ( <book qty='3' /> ). Ik vind het ook altijd lastig hoor, dus ik kan er ook naast zitten ;)
Is XQuery trouwens een andere benaming voor XPath?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Haan schreef op dinsdag 23 februari 2010 @ 14:28:
Wat je nu volgens mij doet is zoeken op een attribute van book dat 'qty' heet ( <book qty='3' /> ). Ik vind het ook altijd lastig hoor, dus ik kan er ook naast zitten ;)
Is XQuery trouwens een andere benaming voor XPath?
XQuery, XPath, komt op hetzelfde neer niet? :+

En nu je het zegt, ik voel me een beetje dom.

code:
1
count(/root/system/BzCartShowContent/bzwebshop/booklist/book/qty = '1') &gt; 0


geeft het systeem aan dat het geen correcte XSLT is (ja, > moet erbij), maar ik denk dat dat wel klopt. Wat zou de juiste syntax zijn in dit geval?

Overigens heb ik een andere conditie die erop lijkt:

code:
1
count(/root/system/BzCartShowContent/bzwebshop/booklist/book[deliverytype=80]) &gt; 0


en deliverytype is hier ook geen attribute, maar een value. Ik zal eens kijken of wel of geen quotes nog verschil uitmaakt.

Edit: Nope.

code:
1
count(/root/system/BzCartShowContent/bzwebshop/booklist/book[qty = 1]) > 0


geeft ook indien qty = 2 gewoon true terug.

[ Voor 7% gewijzigd door YopY op 23-02-2010 14:41 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
YopY schreef op dinsdag 23 februari 2010 @ 14:24:
Daar XSL moeilijk doet met cijfers (dwz je kunt niet gewoon [qty > 2] doen)
Huh, hebben we het nu over XQuery of XSLT? En je kan gewoon wel dit doen in XPath?
code:
1
count(/root/system/BzCartShowContent/bzwebshop/booklist/book[qty>2])>0

Dus wat is het probleem nu eigenlijk? :?
Haan schreef op dinsdag 23 februari 2010 @ 14:28:
Wat je nu volgens mij doet is zoeken op een attribute van book dat 'qty' heet ( <book qty='3' /> ). Ik vind het ook altijd lastig hoor, dus ik kan er ook naast zitten ;)
Attributen gaan met @ (dus @qty).
Is XQuery trouwens een andere benaming voor XPath?
Nee, maar je kan wel XPath gebruiken in XQuery.
YopY schreef op dinsdag 23 februari 2010 @ 14:39:
code:
1
count(/root/system/BzCartShowContent/bzwebshop/booklist/book/qty = '1') > 0


geeft het systeem aan dat het geen correcte XSLT is (ja, > moet erbij), maar ik denk dat dat wel klopt.
Wat in de count staat levert een boolean op, en het zou niet zo nuttig zijn om die te tellen. Toch niet kloppend dus. ;)
geeft ook indien qty = 2 gewoon true terug.
Lijkt me niet, of heb je andere XML dan hier?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • cfern
  • Registratie: Oktober 2009
  • Laatst online: 12-09 16:31
Volgens mij is XQuery iets best wel anders dan XPath.

Ik heb ook even zitten prutsen met je voorbeeldXML, maar ik krijg bij
code:
1
count(/root/system/BzCartShowContent/bzwebshop/booklist/book[qty=2])>0

false terug.

Handige (windows-)tooltjes waar ik zelf erg veel aan gehad heb bij het leren snappen van XSL:
Voor het testen van XPath-expressies: SketchPath
Voor het testen van je XSLT: XSelerator
Misschien kun je ze ook gebruiken om snel wat in te proberen?

"I'd rather have a full bottle in front of me, than a full frontal lobotomy." (Tom Waits) | PoE


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
pedorus schreef op dinsdag 23 februari 2010 @ 14:43:
Huh, hebben we het nu over XQuery of XSLT? En je kan gewoon wel dit doen in XPath?
code:
1
count(/root/system/BzCartShowContent/bzwebshop/booklist/book[qty>2])>0

Dus wat is het probleem nu eigenlijk? :?
XQuery, dat dynamisch in een XSL stylesheet ingevoerd wordt (of dat in dit geval gebruikt wordt om te bepalen of hij een bepaald template met inhoud moet renderen). Even de terminologie correct.

En dat kan je wel doen, is correcte XSL, maar dat lijkt niet correct opgepakt te worden:

XQuery:
1
count(/root/system/BzCartShowContent/bzwebshop/booklist/book[qty &gt; 2]) &gt; 0


geeft ook true indien de XML als volgt is:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<book>
  <ean>9789038893037</ean>
  <title>Titaantjes</title>
  <author>Nescio</author>
  <publisher>Nijgh & v Ditmar</publisher>
  <qty>1</qty>
  <price>12,50</price>
  <totalprice>12,50</totalprice>
  <pkey>520</pkey>
  <extrafield1>24573</extrafield1>
  <listmessage/>
  <listitemid>-1</listitemid>
  <deliverytype>0</deliverytype>
</book>


Edit @ Cfern: Ik zal die tooltjes eens proberen - ik zocht al een tijd naar zoiets, en mij werdt Cooktop aanbevolen, maar dat heb ik nog niet werkend gekregen.

Edit2: SketchPath werkt goed, dank je hiervoor :). Die kan er echter ook geen soep van maken. Het programma werkt wel handig, ik kies een element in de XML (in dit geval de qty), en hij maakt er zelf een goeie xpath query van:

code:
1
/root/system/BzCartShowContent/bzwebshop/booklist/book/qty[text()="1"]


Die het in een count()... soms lijkt te doen. Ik zal er nog even mee spelen.

[ Voor 19% gewijzigd door YopY op 23-02-2010 15:56 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
YopY schreef op dinsdag 23 februari 2010 @ 15:39:
XQuery, dat dynamisch in een XSL stylesheet ingevoerd wordt (of dat in dit geval gebruikt wordt om te bepalen of hij een bepaald template met inhoud moet renderen). Even de terminologie correct.
Dat lijkt me alleen de gedeelde XPath-subset, en niet algemene XQuery, dat is iets anders dan XSLT..
geeft ook true indien de XML als volgt is:
Niet hier als ik het uittest:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
Doe iets.
<xsl:if test="count(/root/system/BzCartShowContent/bzwebshop/booklist/book
              [qty &gt; 2]) &gt; 0">
Apart stukje als meer dan 2 voorkomt.
</xsl:if>
</xsl:template>

</xsl:stylesheet>

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
He he. Kom er nu pas achter dat een paar van de xqueries die ik gebruikt heb wel correct zijn, maar dat ik niet het juiste resultaat te zien krijg omdat er een nogal irritant caching mechanisme is. Ik was onder de indruk dat dat hele gebeuren met XSLT en dergelijke juist toegevoegd was om een pagina dynamisch te houden met caching erbij.

Met andere woorden, ik ben weer dom bezig.

Toch bedankt voor de pointers en dat programmaatje. Jammer dat je (blijkbaar?) niet live XML kunt bewerken en de resultaten van de xpath kunt bekijken.
Pagina: 1