Avatar billede nielsbrinch Nybegynder
10. november 2004 - 09:55 Der er 26 kommentarer og
1 løsning

Tæl antal forekomster af noder med værdien "true"

Jeg har tre værdier, som kan være enten 'true' eller 'false'. I min xslt laver jeg en td som skal have et colspan, der svarer til antallet af gange der står 'true' i disse 3 værdier.

<showUniqueVisitors>
    <type>System.Boolean</type>
    <boolean>true</boolean>
</showUniqueVisitors>
<showSessions>
    <type>System.Boolean</type>
    <boolean>false</boolean>
</showSessions>
<showPageViews>
    <type>System.Boolean</type>
    <boolean>true</boolean>
</showPageViews>

I ovenstående eksempel ville jeg skulle have tallet '2' til at stå i mit colspan.

Hvordan tæller jeg rigtigst antallet af 'true' sammen og lægger dem i en variabel, så jeg kan bruge dem i min td?
Avatar billede atoft Nybegynder
10. november 2004 - 09:58 #1
Prøv med en <xsl:value-of="count(//boolean ='true')" />
Avatar billede atoft Nybegynder
10. november 2004 - 09:59 #2
og hvis det er en variabel
<xsl:variable name="tel" select="count(//boolean ='true')" />
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 10:33 #3
Tak for det hurtige svar.

De tre noder, showUniqueVisitors, showSessions og showPageViews ligger i en stor xml-fil, med masser af værdier omkring sig, så der er risiko for at lige præcis den metode, giver forkerte resultater.

Kan du isolere det til de 3 noder?
Avatar billede atoft Nybegynder
10. november 2004 - 10:37 #4
prøv med en

<xsl:value-of="count(//showUniqueVisitors/boolean ='true') | ////showSessions/boolean ='true')/boolean ='true') |//showPageViews/boolean ='true')" />
Avatar billede atoft Nybegynder
10. november 2004 - 10:38 #5
Det smuttede med copy/paste

<xsl:value-of="count(//showUniqueVisitors/boolean ='true') | //showSessions/boolean ='true') | //showPageViews/boolean ='true')" />
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 10:45 #6
Det ser helt rigtigt ud. Desværre æder parseren det ikke ...

Message: 'count(//showUniqueVisitors/boolean ='true') | //showSessions/boolean ='true') | //showPageViews/boolean ='true')' is an invalid XPath expression.

Min kode ser sådan ud:

<xsl:variable name="resultNumber" select="count(//showUniqueVisitors/boolean ='true') | //showSessions/boolean ='true') | //showPageViews/boolean ='true')" />

<td title="{.}" nowrap="nowrap" colspan="{$resultNumber}" class="xsltTableTitle" style="border-left: 1px solid #000000;">
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 10:47 #7
og parseren fortæller det også lidt mere præcist:

Message: The argument to function 'count' in 'count(//showUniqueVisitors/boolean ='true') | //showSessions/boolean ='true') | //showPageViews/boolean ='true')' cannot be converted to nodeset.
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 10:57 #8
Den siger det også hvis jeg bare bruger
<xsl:variable name="resultNumber" select="count(//boolean ='true')" />

men ikke hvis jeg slet ikke skriver linjen - så det ER altså den der er galt på den.
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 11:12 #9
Efter at have fedtet lidt rundt med det, fandt jeg ud af at følgende virker:
count(//boolean[. = 'true'])
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 11:15 #10
Så er det bare at hitte ud af hvordan jeg får den delt ud på de 3 isolerede noder.

Message: 'count(//showUniqueVisitors/boolean[. ='true']) | //showSessions/boolean[. = 'true']) | //showPageViews/boolean[. = 'true'])' is an invalid XPath expression.
Avatar billede atoft Nybegynder
10. november 2004 - 12:01 #11
dur dette ikke?

<xsl:value-of="count(//showUniqueVisitors/boolean ='true' | //showSessions/boolean ='true' | //showPageViews/boolean ='true')" />
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 12:30 #12
Nej, den dur slet ikke, da det er forkert syntaks. Men hvis jeg skriver den med en mere rigtig syntaks (hvor xpath'en er inde i en select) giver det stadig fejl:

<xsl:value-of select="count(//showUniqueVisitors/boolean ='true' | //showSessions/boolean ='true' | //showPageViews/boolean ='true')"/>
Avatar billede atoft Nybegynder
10. november 2004 - 14:09 #13
Ja der var en lille syntax fejl.

Men hvad er fejl meddelelsen?
Avatar billede atoft Nybegynder
10. november 2004 - 14:15 #14
Jeg har haft rod i mine parenteser. Dette her bør altså virke

<xsl:value-of="count(//showUniqueVisitors/boolean ='true' | //showSessions/boolean ='true' | //showPageViews/boolean ='true')" />
Avatar billede atoft Nybegynder
10. november 2004 - 14:20 #15
Hvis det ikke virker nu, vil jeg gerne se koden.
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 14:21 #16
Den linje du skriver, vil parseren i XMLSpy slet ikke godkende, da selve nodesættet skal være i en "select" efter value-of.

Hvis jeg skriver følgende
<xsl:value-of select="count(//showUniqueVisitors/boolean ='true' | //showSessions/boolean ='true' | //showPageViews/boolean ='true')" />

kommer den med følgende fejlbesked:

Message: The expression passed to this method should result in a NodeSet.
Avatar billede atoft Nybegynder
10. november 2004 - 14:28 #17
Ups er blevet lidt rusten.
<xsl:value-of select="count(//showUniqueVisitors[boolean ='true'] | //showSessions[boolean ='true'] | //showPageViews[boolean ='true']" />
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 14:28 #18
Metoden der omtales er count() og det den ikke mener giver et NodeSet er
//showUniqueVisitors/boolean ='true' | //showSessions/boolean ='true' | //showPageViews/boolean ='true'
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 14:30 #19
Ok, jeg har indsat den seneste linje. Og her er den nye fejl:

Message: 'count(//showUniqueVisitors[boolean ='true'] | //showSessions[boolean ='true'] | //showPageViews[boolean ='true']' has an invalid token.
Avatar billede atoft Nybegynder
10. november 2004 - 14:33 #20
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 14:36 #21
Ja, det ser ud som om du har givet mig det helt rigtige ...
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 14:38 #22
Nej ...

Man kan tilsyneladende kun lave | mellem to værdier - hvis jeg bruger følgende virker det:

count(//showUniqueVisitors[boolean ='true'] | //showSessions[boolean ='true'])

(men så mangler jeg den tredje værdi)
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 14:40 #23
Følgende ser ud til at være løsningen...

<xsl:value-of select="count(//showUniqueVisitors[boolean ='true']) + count(//showPageViews[boolean ='true']) + count(//showSessions[boolean ='true'])" />
Avatar billede atoft Nybegynder
10. november 2004 - 14:45 #24
jeg troede at man kunne blive ved med |

så må det jo blive

<xsl:value-of select="count(//*[name() = 'showUniqueVisitors' or name()= 'showSessions' or name()='showPageViews']/[boolean ='true'] />

måske kan //* laves om til /* det afhænger af det samlede xml documents struktur. Det ville nemlig være noget billigere.
Avatar billede atoft Nybegynder
10. november 2004 - 14:47 #25
Ingen tvivl om at din løsninger er billigere (læs: hurtigere)
Avatar billede nielsbrinch Nybegynder
10. november 2004 - 14:47 #26
Mange tak for din tid.
Avatar billede atoft Nybegynder
10. november 2004 - 14:47 #27
Det var så lidt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester