2012-02-29 11 views
17

Qualcuno può spiegare la differenza tra le funzioni text() e string(). Uso spesso uno con l'altro, ma non fa alcuna differenza, entrambi otterranno il valore stringa del nodo xml.Differenza tra testo() e stringa()

risposta

34

Qualcuno può spiegare la differenza tra testo() e la stringa() funzioni.

I. text() non è una funzione, ma un node test.

Viene utilizzato per selezionare tutti i nodi del nodo di testo del nodo di contesto.

Quindi, se il nodo di contesto è un elemento denominato x, quindi text() seleziona tutti i nodi del nodo di testo di x.

Altri esempi:

/a/b/c/text() 

seleziona tutti i bambini di testo nodi di qualsiasi c elemento che è un bambino di qualsiasi b elemento che è un figlio dell'elemento superiore a.

II. La funzione string()

Per definizione string(exprSelectingASingleNode) restituisce il string value del nodo.

Il valore di stringa di un elemento è la concatenazione di tutti i relativi discendenti del nodo di testo, nell'ordine del documento.

Pertanto, se nel seguente documento XML:

<a> 
    <b>2</b> 
    <c>3 
    <d>4</d> 
    </c> 
    5 
</a> 

string(/a) rendimenti (senza le virgolette circostanti):

" 
    2 
    3 
    4 

    5 
" 

Come si vede, il valore della stringa riflette tre white-space -solo nodi di testo, che in genere non si notano e rappresentano.

Alcuni parser XML hanno l'opzione di rimuovere i nodi di testo di solo spazio bianco. Se il documento di cui sopra è stato analizzato con i nodi che contengono spazio bianco-solo spogliato Off, quindi la stessa funzione:

string(/a) 

restituisce ora:

"23 
    4 
    5 
" 
6

maggior parte del tempo, se si desidera che il contenuto di un elemento nodo X, puoi fare riferimento ad esso come ".", se è il nodo di contesto, o come "X" se è figlio del nodo di contesto.Ad esempio:

<xsl:if test="X = 'abcd'">... 

o

<xsl:value-of select="."/> 

In entrambi i casi, perché il contesto richiede una stringa, la funzione string() viene applicato automaticamente. (Questa è una leggera semplificazione, se si sta eseguendo XSLT 2.0 compatibile con lo schema le regole sono un po 'più complicate).

L'utilizzo di "string()" non è necessario perché è eseguito automaticamente; e usare text() è un errore (uno che sembra essere sempre più comune, incoraggiato da alcuni cattivi tutorial sul web). L'utilizzo di ./text() o X/text() in questa situazione fornisce tutti i nodi del nodo figlio dell'elemento. Spesso l'elemento ha un nodo di testo figlio il cui valore di stringa è uguale al valore di stringa dell'elemento, ma il codice fallisce se qualcuno aggiunge un commento o un'istruzione di elaborazione, poiché il valore viene quindi suddiviso in più nodi di testo. Fallisce anche se l'elemento è uno (dire "title") che consente contenuto misto: string(title) e title/text() stanno per dare la stessa risposta fino a colpire un articolo con il titolo

<title>On the wetness of H<sub>2</sub>O</title> 
+0

ho usato per credere che l'utilizzo di un espressione come select = "/ somenode/text()" sarebbe effettivamente più precisa e meno soggetta a errori. Quindi stai suggerendo che la parte/text() non sia necessaria, anche un errore? Potresti per favore discutere brevemente quando è una buona idea o utile usare/text() allora? Grazie – user8658912

+0

I commenti non sono progettati per porre domande supplementari, si prega di sollevare una nuova domanda. –

+0

(in altre parole) La tua affermazione che _ "stringa() viene applicata automaticamente" _ è vera in diversi elementi XSLT, come xsl: value-of. Tuttavia, si noti che l'utente non menziona affatto XSLT nella sua domanda. Quindi, come hai spiegato, usare text() o string() di solito è sbagliato/non necessario ** in XSLT **, ma ha senso usare string() per esempio in XQuery quando si aspetta il valore di stringa di un nodo, altrimenti avremmo invece il nodo completo, giusto? Mentre text() sarebbe piuttosto appropriato per navigare in modo specifico attraverso i nodi di testo. – user8658912