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?
Annonceindlæg tema
Cloud & AI
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
10. november 2004 - 09:58
#1
Prøv med en <xsl:value-of="count(//boolean ='true')" />
10. november 2004 - 09:59
#2
og hvis det er en variabel <xsl:variable name="tel" select="count(//boolean ='true')" />
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?
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')" />
10. november 2004 - 10:38
#5
Det smuttede med copy/paste <xsl:value-of="count(//showUniqueVisitors/boolean ='true') | //showSessions/boolean ='true') | //showPageViews/boolean ='true')" />
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;">
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.
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.
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'])
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.
10. november 2004 - 12:01
#11
dur dette ikke? <xsl:value-of="count(//showUniqueVisitors/boolean ='true' | //showSessions/boolean ='true' | //showPageViews/boolean ='true')" />
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')"/>
10. november 2004 - 14:09
#13
Ja der var en lille syntax fejl. Men hvad er fejl meddelelsen?
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')" />
10. november 2004 - 14:20
#15
Hvis det ikke virker nu, vil jeg gerne se koden.
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.
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']" />
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'
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.
10. november 2004 - 14:33
#20
10. november 2004 - 14:36
#21
Ja, det ser ud som om du har givet mig det helt rigtige ...
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)
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'])" />
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.
10. november 2004 - 14:47
#25
Ingen tvivl om at din løsninger er billigere (læs: hurtigere)
10. november 2004 - 14:47
#26
Mange tak for din tid.
10. november 2004 - 14:47
#27
Det var så lidt.
Kurser inden for grundlæggende programmering