Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di salasir
    Registrato dal
    Apr 2004
    Messaggi
    1,887

    [XPath] Contare nodi selezionati

    Premetto che non sono esperto di xsl/xml e probabilmente la soluzione è banale.

    Avrei la necessità di contare i nodi presenti nel mio file xml che abbiano certe caratteristiche, per esempio inizino con una certa lettera.
    Ho utilizzato

    <xsl:value-of select="count(child::*)" />

    annidato sotto un

    <xsl:if test...">.

    In pratica una cosa così:
    codice:
    <xsl:for-each select="elenco">
    <xsl:if test="(starts-with(item/nome, $Iniziale)) or ($Iniziale='*')">
        <xsl:value-of select="count(child::*)" />
    </xsl:if>
    </xsl:for-each>
    Il count funziona, ma mi dà sempre il numero di nodi totali presenti e non quelli selezionati.
    Si può fare?

    Grazie
    Maurizio

    "se ami il lavoro che fai, non lavorerai mai un giorno in vita tua!"

  2. #2
    ciao salasir, nel penultimo post del thread link utili trovi il link a un tutorial su XPath su Zvon che ho tradotto.
    nel dettaglio, leggerai che ti basta, per esempio, una sintassi del genere:

    codice:
    //*[starts-with(name(),'B')]
    per selezionare tutti i nodi il cui nome inizia con una "B".
    un appunto: la prossima volta, cortesemente, leggi quanto consigliato in questo avviso prima di aprire una discussione.

    ciao

  3. #3
    Utente di HTML.it L'avatar di salasir
    Registrato dal
    Apr 2004
    Messaggi
    1,887
    Scusa per il titolo ... non sono un assiduo frequentatore di questa sezione; sto imparando da poco a giocare con xml e xsl.

    Comunque tornando a noi. Ho dato un'occhiata al link che mi hai indicato, ma, se non ho capito male, si parla di selezione dei tag:
    codice:
    //CCC | //BBB 
    Selezione di tutti gli elementi CCC e BBB 
    
         <AAA> 
              <BBB/> 
              <CCC/> 
              <DDD> 
                   <CCC/> 
              </DDD> 
              <EEE/> 
         </AAA>
    Il mio problema (forse era meglio che postassi anche un esempio di xml) credo sia diverso:
    codice:
    <root>
    <item>
         <nome>Antonio</nome>
         <citta>Milano</citta>
    </item>
    <item>
         <nome>Barbara</nome>
         <citta>Milano</citta>
    </item>
    <item>
        <nome>Angelo</nome>
         <citta>Roma</citta>
    </item>
          ....
    </root>
    Io vorrei contare tutti i <nome> che iniziano per "A". (In questo caso 2).
    Inoltre potrei necessitare di contare tutti quelli che iniziano per "A" ed abitano a Milano ("1") e così via con altre combinazioni di tre o quattro variabili.

    Maurizio

    "se ami il lavoro che fai, non lavorerai mai un giorno in vita tua!"

  4. #4
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Originariamente inviato da salasir
    Scusa per il titolo ... non sono un assiduo frequentatore di questa sezione; sto imparando da poco a giocare con xml e xsl.

    Comunque tornando a noi. Ho dato un'occhiata al link che mi hai indicato, ma, se non ho capito male, si parla di selezione dei tag:
    codice:
    //CCC | //BBB 
    Selezione di tutti gli elementi CCC e BBB 
    
         <AAA> 
              <BBB/> 
              <CCC/> 
              <DDD> 
                   <CCC/> 
              </DDD> 
              <EEE/> 
         </AAA>
    Il mio problema (forse era meglio che postassi anche un esempio di xml) credo sia diverso:
    codice:
    <root>
    <item>
         <nome>Antonio</nome>
         <citta>Milano</citta>
    </item>
    <item>
         <nome>Barbara</nome>
         <citta>Milano</citta>
    </item>
    <item>
        <nome>Angelo</nome>
         <citta>Roma</citta>
    </item>
          ....
    </root>
    Io vorrei contare tutti i <nome> che iniziano per "A". (In questo caso 2).
    Inoltre potrei necessitare di contare tutti quelli che iniziano per "A" ed abitano a Milano ("1") e così via con altre combinazioni di tre o quattro variabili.

    nel tutorial che ti ha segnalato var c'è un esempio che trova dei nodi che iniziano con una certa lettera...prova a leggere...
    I got the remedy

  5. #5
    salasir, se parli di test sul contenuto di un elemento piuttosto che sul suo nome, allora prova così:

    codice:
    count(//*[starts-with(.,'D')])
    altre condizioni le concateni con l'AND logico.

    ciao

  6. #6
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    una domanda.
    non sarebbe meglio fare
    count(//nome[starts-with(., 'A')])

    cioè tutti i tag nome il cui contenuto inizia per 'A', o sbaglio?
    I got the remedy

  7. #7
    Originariamente inviato da albgen
    una domanda.
    non sarebbe meglio fare
    count(//nome[starts-with(., 'A')])

    cioè tutti i tag nome il cui contenuto inizia per 'A', o sbaglio?
    se non erro l'analisi coinvolge tutti i nodi del documento, ecco il perchè dell'asterisco.

    ciao

  8. #8
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Originariamente inviato da var
    se non erro l'analisi coinvolge tutti i nodi del documento, ecco il perchè dell'asterisco.

    ciao
    invece facendo //nome, selezioni solo i nodi nome, per cui dovrebbe funzionare.
    cmq, grazie
    ciao
    I got the remedy

  9. #9
    Utente di HTML.it L'avatar di salasir
    Registrato dal
    Apr 2004
    Messaggi
    1,887
    Sì, infatti intendevo il contenuto non il nome del nodo.

    Adesso provo ma penso che dovrò dare una letta a qualche tutorial di XPath per capire come utilizzarlo.
    Maurizio

    "se ami il lavoro che fai, non lavorerai mai un giorno in vita tua!"

  10. #10
    Utente di HTML.it L'avatar di salasir
    Registrato dal
    Apr 2004
    Messaggi
    1,887
    Rieccomi.
    Tutto a posto per il count. In effetti come diceva albgen devo contare tutti i nodi <nome> che contengono l'informazione, per cui ho utilizzato l'espressione
    codice:
    count(//item/nome[starts-with(.,$Iniziale) or ($Iniziale='*')]
    Ora subentra un'altra difficoltà (per me )

    Siccome ho tre variabili da mettere in "and", qual'è la sintassi ?

    come facevo con il vecchio if.
    codice:
    <xsl:if test="(starts-with(item/nome, $Iniziale)) or ($Iniziale='*')">
    <xsl:if test="(starts-with(item/citta, $localita)) or ($localita='*')">
    ....
    Maurizio

    "se ami il lavoro che fai, non lavorerai mai un giorno in vita tua!"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.