REC-xpath-19991116-it
REC-xpath-19991116-itXML Path Language (XPath) 1.0Questo documento è la traduzione in italiano della Recommendation
del W3C "XML Path Language (XPath) 1.0".
Avvertenze Ogni errore trovato in questa traduzione può essere segnalato scrivendo a dario@xmlblog.it Si ringrazia per la collaborazione la dott.ssa Paola Carrara dell'istituto ITIM - CNR di Milano e la dott.ssa Sabrina Di Monte. Copyright © 1999 W3C (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use and software licensing rules apply. |
Copyright © 1999 W3C® (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use and software licensing rules apply.
XPath è un linguaggio per l'indirizzamento di parti di un documento XML, pensato per essere utilizzato sia da XSLT che da XPointer.
Questo documento è stato rivisto dai membri del W3C e da altri gruppi interessati ed è stato approvato dal Direttore come una Recommendation del W3C. E' un documento stabile e può essere utilizzato come materiale di riferimento o citato come norma di riferimento in altri documenti. Il ruolo del W3C è di segnalare le specifiche e di promuoverne l'impiego più ampio e diffuso. Questo incrementa la funzionalità e l'interoperabilità del Web.
La lista degli errori noti in questa specifica è disponibile al sito: http://www.w3.org/1999/11/REC-xpath-19991116-errata.
I commenti su questa specifica posso essere inviati all'indirizzo: www-xpath-comments@w3.org; sono disponibili gli archivi dei commenti.
La versione inglese di questa specifica è l'unica versione normativa. Eventualmente, per le traduzioni di questo documento, vedi il sito: http://www.w3.org/Style/XSL/translations.html.
Una lista delle Recommendation W3C e di altri documenti tecnici può essere consultata al sito: http://www.w3.org/TR.
Queste specifica è frutto del lavoro del XSL Working Group e del XML Linking Working Group ed è quindi parte del W3C Style activity e del W3C XML activity.
XPath è il risultato di un sforzo atto a fornire una sintassi e una semantica comune per le funzionalità che vengono condivise tra XSL Transformations [XSLT] e XPointer [XPointer]. Lo scopo primario di XPath è di indirizzare parti di un documento XML [XML]. A supporto di questa funzione, fornisce anche dei strumenti di base che facilitano la manipolazione di stringhe, numeri e booleani. XPath utilizza una sintassi compatta e non-XML per favorirne l'uso all'interno degli URI e dei valori degli attributi XML. XPath si basa sulla struttura astratta e logica di un documento XML e non sulla sua sintassi formale. XPath è così denominato dall'utilizzo della notazione di percorso come accade negli URL per la navigazione nella struttura gerarchica di un documento XML.
In aggiunta all'utilizzo per l'indirizzamento, XPath è stato pensato per fornire anche un sottoinsieme naturale che può essere utilizzato per il matching (ovvero per verificare se un nodo corrisponde o meno ad una struttura); questo utilizzo è descritto in XSLT.
XPath modella un documento XML come un albero di nodi. Esistono diverse tipologie di nodi che includono i nodi elemento, i nodi attributo e i nodi testo. XPath definisce una modalità per elaborare un string-value per ciascuna tipologia di nodo. Alcuni tipi di nodi hanno anche dei nomi. XPath supporta completamente XML Namespaces [XML Names]. Quindi, il nome di un nodo è modellato come una coppia che consiste di una parte locale e di una parte di namespaces URI che può essere nulla; questa è chiamata expanded-name. Il modello dei dati è descritto in dettaglio nel [5 Modello dei Dati].
Il construtto sintattico primario in XPath è l' espressione. Un'espressione corrisponde alla produzione Expr. Un'espressione è valutata per restituire un oggetto che appartiene a una delle quattro tipologie base:
La valutazione di un'espressione avviene rispetto ad un contesto. XSLT e XPointer specificano come il contesto sia definito per le espressioni XPath usate rispettivamente in XSLT e in XPointer. Il contesto è costituito da:
La posizione contesto è sempre inferiore o uguale alla dimensione contesto.
I legami delle variabili consistono da una mappatura che va dai nomi delle variabili ai valori delle variabili. Il valore di una variabile è un oggetto che può essere uno qualsiasi dei tipi possibili per il valore di un'espressione e può anche appartenere ad uno dei tipi addizionali che non vengono qui specificati.
La libreria di funzioni consiste in una mappatura che va dai nomi delle funzioni alle funzioni medesime. Ciascuna funzione prende zero a più argomenti e restituisce un unico risultato. Questo documento definisce una libreria di funzioni principali che tutte le implementazioni di XPath devono supportare (vedi [4 Libreria delle Funzioni Principali ]). Per una funzione nella libreria di funzioni principali, argomenti e risultato appartengono a uno dei quattro tipi base. Sia XSLT che XPointer estendono XPath definendo funzioni addizionali; alcune di queste funzioni operano su i quattro tipi base; altre operano su tipi di dati addizionali definiti da XSLT e XPointer.
Le dichiarazioni namespace consistono in una mappatura che va dai prefissi agli URI dei namespaces.
I legami delle variabili, la libreria di funzioni e le dichiarazioni namespace utilizzate per valutare una sottoespressione sono sempre gli stessi di quelli usati per valutare l'espressione che la contiene. Invece il nodo contesto, la posizione contesto e la dimensione contesto usati per valutare una sottoespressione sono talvolta differenti da quelli utilizzati per valutare l'espressione nel suo insieme. Molti tipi di espressioni cambiano il nodo contesto; solo i predicati cambiano la posizione contesto e la dimensione contesto (vedi [2.4 Predicati]). Quando viene descritta la valutazione di un tipo di espressione, sarà sempre esplicitamente dichiarato se il nodo contesto, la posizione contesto e la dimensione contesto cambiano nella valutazione delle sottoespressioni; se niente è detto sul nodo contesto, sulla posizione contesto e sulla dimensione contesto, essi non cambiano nella valutazione delle sottoespressioni di quel tipo particolare di espressione.
Espressioni di XPath compaiono spesso negli attributi XML.
La grammatica specificata in questa sezione si riferisce al valore dell'attributo
secondo la normativa XML 1.0. Perciò, ad esempio, se la grammatica usa il carattere
<
, questo non deve apparire nella sorgente XML come
<
ma deve essere contrassegnato secondo le regole di XML 1.0 digitandolo,
ad esempio, come <
. All'interno delle espressioni le stringhe letterali
vengono delimitate da virgolette singole o doppie che vengono anche utilizzate per delimitare
gli attributi XML. Per evitare che una virgolettatura all'interno di un'espressione
sia interpretata dal processore XML come la parte che delimita il valore dell'attributo,
le virgolette possono essere inserite come un riferimento a carattere
("
o '
). In alternativa,
l'espressione può utilizzare singole virgolette se l'attributo XML
viene delimitato da doppie virgolette o viceversa.
Un'importante forma di espressione è un location path. Un location path seleziona un insieme di nodi relativi ad un context node. Il risultato che deriva dalla valutazione di un'espressione che è un location path, è il node-set ovvero l'insieme dei nodi selezionati dal location path. I location path possono contenere in modo ricorsivo espressioni che vengono utilizzate per filtrare insiemi di nodi. Una location path corrisponde alla produzione LocationPath.
Nella grammatica seguente, i non-terminali QName e NCName vengono definiti in [XML Names], e S è definito in [XML]. La grammatica utilizza la stessa notazione di EBNF come [XML] (salvo che i simboli grammaticali hanno sempre le lettere iniziali maiuscole).
Le espressioni vengono analizzate prima dividendo la stringa dei caratteri da analizzare in token e poi analizzando la sequenza risultante di token. Gli spazi bianchi possono essere utilizzati liberamente tra i token. Il processo di divisione in token è descritto nel [3.7 Struttura Lessicale].
Sebbene i percorsi di posizionamento non siano il costrutto grammaticale più generale nel linguaggio (un LocationPath è un caso speciale di un Expr), sono comunque il più importante e perciò verranno descritti per primi.
Ogni location path può essere espresso utilizzando una sintassi semplice ma piuttosto prolissa. Ci sono pure un certo numero di abbreviazioni sintattiche che permettono di esprimere i casi comuni in modo conciso. Questa sezione spiegherà la semantica dei location path utilizzando la sintassi non abbreviata. La sintassi abbreviata sarà poi spiegata mostrando come si espanda nella sintassi non abbreviata (vedi [2.5 Sintassi Abbreviata]).
Qui vengono riportati alcuni esempi di location path che utilizzano la sintassi non abbreviata:
child::para
seleziona gli elementi para
figli del context node
child::*
seleziona tutti gli elementi figli del
context node
child::text()
seleziona tutti i text
node figli del context node
child::node()
seleziona tutti i figli del context node, qualsiasi sia il loro tipo
di nodo
attribute::name
seleziona l'attributo name
del
context node
attribute::*
seleziona tutti gli attributi del
context node
descendant::para
seleziona gli elementi para
discendenti del context node
ancestor::div
seleziona tutti gli antenati div
del context node
ancestor-or-self::div
seleziona gli antenati div
del context node e, se il context node è
un elemento div
, seleziona pure il context node
descendant-or-self::para
seleziona gli elementi para
discendenti del context node e, se il context node è un elemento
para
seleziona pure il context node
self::para
seleziona il context node se è un elemento
para
, altrimenti non seleziona nulla
child::chapter/descendant::para
seleziona gli elementi para
discendenti degli elementi chapter
figli del context node
child::*/child::para
seleziona tutti i nipoti para
del context node
/
seleziona la radice del documento (che è sempre genitore dell'elemento documento)
/descendant::para
seleziona tutti gli elementi para
nello stesso documento in cui è contenuto il context node
/descendant::olist/child::item
seleziona tutti gli elementi
item
che hanno un genitore olist
e che sono
nello stesso documento in cui è contenuto il context node
child::para[position()=1]
seleziona il primo figlio para
del context node
child::para[position()=last()]
seleziona l'ultimo figlio
para
del context node
child::para[position()=last()-1]
seleziona il penultimo figlio
para
del context node
child::para[position()>1]
seleziona tutti i figli para
del context node eccetto il primo para
figlio del context node
following-sibling::chapter[position()=1]
seleziona il prossimo
chapter
fratello del context node
preceding-sibling::chapter[position()=1]
seleziona il precedente
chapter
fratello del context node
/descendant::figure[position()=42]
seleziona il quarantaduesimo elemento figlio
figure
nel documento
/child::doc/child::chapter[position()=5]/child::section[position()=2]
seleziona la seconda section
del quinto chapter
degli elementi del documento doc
child::para[attribute::type="warning"]
seleziona tutti i figli
para
del context node che ha un attributo type
con valore warning
child::para[attribute::type='warning'][position()=5]
seleziona
il quinto figlio para
del context node che ha un attributo
type
con valore warning
child::para[position()=5][attribute::type="warning"]
seleziona
il quinto figlio para
del context node se quel figlio ha un
attributo type
con valore warning
child::chapter[child::title='Introduction']
seleziona i figli
chapter
del context node che hanno uno o più figli title
con il string-value uguale a
Introduction
child::chapter[child::title]
seleziona i figli chapter
del context node che hanno uno o più figli title
child::*[self::chapter or self::appendix]
seleziona i figli
chapter
e appendix
del context node
child::*[self::chapter or self::appendix][position()=last()]
seleziona l'ultimo figlio chapter
o appendix
del
context node
Ci sono due tipi di location path: location path relativi ed assoluti.
Un location path relativo è una sequenza di uno o più location step (passi di posizionamento) separati da una /
.
I passi in un location path relativo si compongono da sinistra verso destra.
Ciascun passo seleziona a sua volta un'insieme di nodi relativi ad un context node.
Una sequenza iniziale di passi si compone come segue: la sequenza iniziale seleziona un insieme di nodi relativi ad un context node.
Ciascun nodo in quel insieme è utilizzato come un context node per il passo successivo.
Gli insiemi di nodi identificati da quel passo vengono composti attraverso l'unione.
L'insieme di nodi identificati dalla composizione dei passi è questa unione.
Per esempio, child::div/child::para
seleziona
gli elementi para
figli degli elementi div
figli
del context node, oppure, in altre parole, seleziona gli elementi para
nipoti del context node che hanno come genitori un elemento div
.
Un location path assoluto è costituito da una /
seguita eventualmente da un location path relativo.
Una singola /
seleziona l'elemento radice del documento contenente il context node.
Se essa è seguita da un location path relativo, allora il location path seleziona
il node-set che verrebbero selezionati da un location path relativo
al nodo radice del documento che contiene il context node.
[1] | LocationPath | ::= | RelativeLocationPath | |
| AbsoluteLocationPath | ||||
[2] | AbsoluteLocationPath | ::= | '/' RelativeLocationPath? | |
| AbbreviatedAbsoluteLocationPath | ||||
[3] | RelativeLocationPath | ::= | Step | |
| RelativeLocationPath '/' Step | ||||
| AbbreviatedRelativeLocationPath |
Un passo di posizionamento (location step) si compone di tre parti:
un asse, che specifica la relazione nell'albero tra i nodi selezionati dal location step e il context node,
un nodo controllo (node test) che specifica il tipo di nodo e l' expanded-name dei nodi selezionati dal location step e
zero o più predicati che utilizzano espressioni arbitrarie per definire meglio l'insieme dei nodi selezionati dal location step.
La sintassi di un location step è determinata dal nome dell'asse e
dal controllo separati da una coppia di due punti, seguiti da zero o più espressioni, ciascuna tra parentesi quadre. Ad esempio,
nel child::para[position()=1]
, child
è il nome dell'asse
, para
è il controllo e
[position()=1]
è un predicato.
L'insieme dei nodi selezionati dal location step è l'insieme dei nodi risultante dalla generazione di un insieme iniziale a partire dall'asse e dal controllo e poi filtrando quell'insieme dai nodi di volta in volta tramite ciascuno dei predicati.
L'insieme dei nodi iniziale è costituito da nodi che sono in relazione al context node
come specificato dall'asse che hanno il node type e l' expanded-name specificato dal controllo. Ad
esempio, un location step descendant::para
seleziona gli elementi para
discendenti del context node:
descendant
specifica che ciascun nodo nell'insieme nodo iniziale deve essere un discendente del contesto;
para
specifica che ciascun nodo nell'insieme deve essere un elemento di nome
para
. Gli assi disponibili vengono descritti in [2.2
Assi]. I controlli disponibili vengono descritti in [2.3 Controlli]. Il significato di alcuni node-test è dipendente dall'asse.
L'insieme dei nodi iniziale è filtrato dal primo predicato per generare un nuovo insieme di nodi; questo nuovo insieme è quindi filtrato usando il secondo predicato e così via di seguito. L'insieme finale è l'insieme dei nodi selezionati dal location step. L'asse influenza la valutazione dell'espressione in ciascun predicato e così la semantica di un predicato viene definita rispetto un asse. Vedi [2.4 Predicati].
[4] | Step | ::= | AxisSpecifier NodeTest Predicate* | |
| AbbreviatedStep | ||||
[5] | AxisSpecifier | ::= | AxisName '::' | |
| AbbreviatedAxisSpecifier |
Sono disponibili i seguenti assi:
l'asse child
contiene i figli del context node
l'asse descendant
contiene i discendenti del context node; un discendente è un figlio o
un figlio del figlio e così di seguito; quindi l'asse discendente non contiene mai nodi attributo o namespaces
l'asse parent
contiene il genitore del context node, se ne esiste uno
l'asse ancestor
contiene gli antenati del
context node; gli antenati del context node sono costituiti dal genitore del context node e del genitore dei genitori e così di seguito;
quindi, l'asse ancestor includerà sempre l'elemento radice, a meno che il context node sia l'elemento radice
l'asse following-sibling
contiene tutti i
fratelli successivi al context node; se il context node è un nodo attributo
o nodo namespace, l'asse following-sibling
è
vuoto
l'asse preceding-sibling
contiene tutti i fratelli che precedono il context node;
se il context node è un nodo attributo o un nodo namespace, l'asse
preceding-sibling
è
vuoto
l'asse following
contiene tutti i nodi nello stesso documento
in cui si trova il context node che sono dopo il context node nell'ordine del documento,
escludendo ogni discendente e i nodi attributo e i nodi namespace
l'asse preceding
contiene tutti i nodi nello
stesso documento in cui si trova il context node che vengono prima del context node nell'ordine del documento,
escludendo gli antenati e i nodi attributo e i nodi namespace
l'asse attribute
contiene gli attributi del context node;
l'asse sarà vuoto a meno che il context node sia un elemento
l'asse namespace
contiene i nodi namespace del context node; l'asse sarà vuoto a meno che
il context node sia un elemento
l'asse self
contiene solo il context node
l'asse descendant-or-self
contiene il context node e i discendenti del context node
l'asse ancestor-or-self
contiene il context node e gli antenati del context node;
quindi l'asse ancestor sempre includerà il nodo radice
NOTA: Gli assiancestor
,descendant
,following
,preceding
eself
generano una ripartizione partizione del documento (ignorando i nodi attributi e namespaces): non si sovrappongono e insieme contengono tutti i nodi del documento.
Ogni asse ha un tipo di nodo principale (principal node type). Se un asse può contenere elementi, allora il principal node type è elemento; in caso contrario è il tipo dei nodi che l'asse può contenere. Quindi,
Un controllo che è un QName è
vero se e solo se il tipo del nodo (vedi [5 Modello dei Dati]) è
il principal node type e ha un expanded-name uguale all' expanded-name
specificato dal QName. Ad esempio,
child::para
seleziona gli elementi para
figli del context node;
se il context node non ha figli
para
,selezionerà un insieme vuoto di nodi.
attribute::href
seleziona
l'attributo href
del context node; se il context node non ha attributi
href
selezionerà un insieme vuoto di nodi.
Un QName nel controllo si espande in un expanded-name utilizzando le dichiarazioni namespace dal contesto d'espressione.
Si usa lo stesso metodo per i nomi dei tipi d'elemento nei tag d'inizio e fine eccetto che non si utilizza la dichiarazione di default
xmlns
per namespace: se il QName non ha un prefisso,
allora il namespace URI è nullo ( è la stessa modalità
con cui si espandono i nomi d'attributo). E' un errore se il QName ha un prefisso che non
corrisponde alla dichiarazione namespace nel contesto d'espressione.
Un controllo *
è vero per qualsiasi nodo del principal node type. Ad esempio,
child::*
selezionerà tutti gli elementi figli del context
node, e attribute::*
selezionerà tutti gli attributi del context
node.
Un controllo può avere la forma NCName:*
.
In questo caso, il prefisso è espanso allo stesso modo come per un QName, utilizzando le dichiarazioni del context namespace.
E' un errore se nel contesto d'espressione una dichiarazione namespace compare per il prefisso. Il controllo sarà vero da ogni nodo del principal type il cui
expanded-name ha il namespace URI ove
si espande il prefisso, indipendentemente dalla parte locale del nome.
Il controllo text()
è vero per ogni nodo testo. Ad esempio,
child::text()
selezionerà il nodo testo figlio del
context node. Allo stesso modo, il controllo comment()
è vero per ogni nodo commento,
e il controllo processing-instruction()
è vero per ogni istruzione di processo.
I controlli processing-instruction()
possono avere un argomento che è Literal;
in questo caso, questo è vero per ogni istruzione di processo che ha un nome uguale al valore del Literal.
Un controllo node()
è vero per ogni nodo di qualsiasi tipo.
[7] | NodeTest | ::= | NameTest | |
| NodeType '(' ')' | ||||
| 'processing-instruction' '(' Literal ')' |
Un asse può essere sia un asse diretto (forward axis) che un asse inverso (reverse axis). Un asse è un forward axis se contiene il context node e i nodi che lo seguono secondo l'ordine del document order . Un asse è reverse axis se contiene il context node e i nodi che lo precedono secondo l'ordine del document order. Quindi, l'ancestor, l'ancestor-or-self, il preceding, e i preceding-sibling axes sono tutti reverse axes; i rimanenti sono forward axes. Dato che il self axis contiene al massimo un nodo, può essere sia un forward che un reverse axis. La posizione relativa (o proximity position) di un membro di un insieme nodo riferito ad un asse è definita come la posizione del nodo nell'insieme nodo secondo l'ordine del documento se l'asse è un forward axis e ordinato in ordine inverso al documento se l'asse è un reverse axis. La prima posizione è 1.
Un predicato filtra un insieme nodo rispetto ad un asse per produrre un nuovo insieme. Per ciascun nodo che deve essere filtrato nell'insieme nodo, il PredicateExpr viene valutato con quel nodo come il context node, con il numero dei nodi nell'insieme nodo come il context size, e con la proximity position del nodo nell'insieme nodo riferito all'asse come il context position; se PredicateExpr risulta vera per quel nodo, il nodo viene incluso nel nuovo insieme; altrimenti, non viene incluso.
Si valuta una PredicateExpr
valutando l' Expr e convertendo il risultato ad un booleano. Se il risultato è un numero,
il risultato verrà convertito a vero, se il numero risultante è uguale al context position e verrà
convertito a falso in caso contrario;
se il risultato non è un numero, allora il risultato verrà convertito come se si chiamasse la funzione boolean.
Quindi una location path para[3]
è equivalente
ad un para[position()=3]
.
[8] | Predicate | ::= | '[' PredicateExpr ']' | |
[9] | PredicateExpr | ::= | Expr |
Ecco alcuni esempi di location path che utilizzano la sintassi abbreviata:
para
seleziona gli elementi para
figli del context node
*
seleziona tutti gli elementi figli del context node
text()
seleziona tutti i nodi testo figli del context node
@name
seleziona l'attributo name
del context node
@*
seleziona tutti gli attributi del context node
para[1]
seleziona il primo figlio para
del context node
para[last()]
seleziona l'utimo figlio para
del context node
*/para
seleziona tutti i nipoti para
del context node
/doc/chapter[5]/section[2]
seleziona la seconda section
del quinto chapter
del doc
chapter//para
seleziona gli elementi para
discendenti degli elementi chapter
figli del context node
//para
seleziona tutti i discendenti para
del document root e quindi seleziona tutti gli elementi para
dello stesso documento cui appartiene il context node
//olist/item
seleziona tutti gli elementi item
nello stesso documento cui appartiene il context node che hanno un genitore olist
.
seleziona il context node
.//para
seleziona gli elementi para
discendenti del context node
..
seleziona il genitore del context node
../@lang
seleziona l'attributo lang
del genitore del context node
para[@type="warning"]
seleziona tutti i figli para
del context node che hanno un attributo type
con il valore warning
para[@type="warning"][5]
seleziona il quinto figlio para
del context node che ha un attributo type
con valore warning
para[5][@type="warning"]
seleziona il quinto figlio para
del context node se quel figlio ha un attributo type
con valore warning
chapter[title="Introduction"]
seleziona il figlio chapter
del context node che ha uno o più figli title
con string-value uguale a Introduction
chapter[title]
seleziona il figlio chapter
del context node che ha uno o più figli title
children
employee[@secretary and @assistant]
seleziona tutti i figli employee
del context node che hanno sia un attributo secretary
e un attributo assistant
attribute
La più importante abbreviazione è quella che child::
può essere omesso da un location step. In effetti, child
è l'asse di default. Ad esempio, un location
path div/para
è un'abbreviazione per child::div/child::para
.
Esiste pure un'abbreviazione per gli attributi: attribute::
può essere abbreviato a @
.
Ad esempio, un location path
para[@type="warning"]
è l'abbreviazione di child::para[attribute::type="warning"]
e così selezionerà i figli
para
con un attributo type
di valore uguale a warning
.
//
è l'abbreviazione di /descendant-or-self::node()/
.
Ad esempio, //para
è l'abbreviazione di /descendant-or-self::node()/child::para
e così selezionerà
ogni elemento para
nel documento (anche un elemento para
che è
un elemento documento verrà selezionato da //para
per il fatto che il
nodo dell'elemento documento è un figlio del nodo radice); div//para
è l'abbreviazione di
div/descendant-or-self::node()/child::para
e così selezionerà
tutti i discendenti para
dei figli div
.
NOTA: Il location path//para[1]
non ha il medesimo significato del location path/descendant::para[1]
. Questo ultimo seleziona il primo elemento discendentepara
; il primo invece seleziona tutti gli elementi discendentipara
che sono i primi figlipara
dei loro genitori.
Un location step di .
è l'abbreviazione di self::node()
.
Questo è particolarmente utile se usato con //
. Ad esempio, il location
path .//para
è l'abbreviazione di
self::node()/descendant-or-self::node()/child::para
e così selezionerà tutti gli elementi discendenti para
del context node.
In maniera simile, un location step di ..
è l'abbreviazione di
parent::node()
. Ad esempio, ../title
è l'abbreviazione di
parent::node()/child::title
e così selezionerà
i figli title
del genitore del context node.
[10] | AbbreviatedAbsoluteLocationPath | ::= | '//' RelativeLocationPath | |
[11] | AbbreviatedRelativeLocationPath | ::= | RelativeLocationPath '//' Step | |
[12] | AbbreviatedStep | ::= | '.' | |
| '..' | ||||
[13] | AbbreviatedAxisSpecifier | ::= | '@'? |
Una VariableReference valuta il valore al quale il nome della variabile è legata nell'insieme dei legami di varabile nel contesto. Si commette un errore se il nome della variabile non è legato a nessun valore nell'insieme dei legami di variabile nel contesto dell'espressione.
Si possono utilizzare le parentesi per raggruppare.
[14] | Expr | ::= | OrExpr | |
[15] | PrimaryExpr | ::= | VariableReference | |
| '(' Expr ')' | ||||
| Literal | ||||
| Number | ||||
| FunctionCall |
Un'espressione FunctionCall viene valutata usando la FunctionName per identificare una funzione nella libreria di funzioni di contesto per la valutazione delle espressioni, valutando ciascuno degli Argument, convertendo ciascun argomento al tipo richiesto dalla funzione e richiamando la funzione stessa, passandone gli argomenti convertiti. E' un errore se è errato il numero degli argomenti oppure se un argomento non può essere convertito secondo il tipo richiesto. Il risultato di una espressione FunctionCall è il risultato restituito dalla funzione.
Si converte un argomento ad un tipo stringa desiderato chiamando la funzione string. Si converte un argomento ad un tipo numero chiamando la funzione number. Si converte un argomento ad un tipo booleano chiamando la funzione boolean. Un argomento che non è del tipo insieme nodo, non può essere convertito in un insieme nodo.
[16] | FunctionCall | ::= | FunctionName '(' ( Argument ( ',' Argument )* )? ')' | |
[17] | Argument | ::= | Expr |
Un location path può essere utilizzato come un'espressione. L'espressione restituisce l'insieme dei nodi selezionati dal path.
L'operatore |
calcola l'unione dei suoi operandi, che devono essere dei node-set.
I Predicates vengono usati per filtrare espressioni allo stesso modo in cui vengono utilizzati nei location path. E' un errore se l'espressione da filtrare non equivale al node-set. Il Predicate filtra il node-set rispetto ad un asse figlio.
NOTA: Il significato di un Predicate dipende fondalmentalmente dall'asse su cui viene applicato. Ad esempio,preceding::foo[1]
restituisce il primo elementofoo
nell' ordine inverso del documento, perché l'asse che viene applicato al predicato[1]
è l'asse preceding; al contrario,(preceding::foo)[1]
restituisce il primo elementofoo
nel document order, perchè l'asse applicato al predicato[1]
è l'asse figlio.
Gli operatori /
e //
compongono un'espressione
e la location path relativa. E' un errore se l'espressione non viene considerata rispetto ad un
node-set. L'operatore /
compone allo stesso modo
come nel caso /
si usa in un location path. Come nei location path, //
è l'abbreviazione di /descendant-or-self::node()/
.
Non ci sono tipi di oggetti che possono essere convertiti ad un insieme nodo.
[18] | UnionExpr | ::= | PathExpr | |
| UnionExpr '|' PathExpr | ||||
[19] | PathExpr | ::= | LocationPath | |
| FilterExpr | ||||
| FilterExpr '/' RelativeLocationPath | ||||
| FilterExpr '//' RelativeLocationPath | ||||
[20] | FilterExpr | ::= | PrimaryExpr | |
| FilterExpr Predicate |
Un oggetto di tipo booleano può possedere uno dei due valori vero o falso.
Una espressione or
si valuta
valutando ciascun operando e convertendo il rispettivo valore ad un booleano richiamando la funzione boolean. Il risultato è vero se almeno un valore
è vero, altrimenti è falso. L'operando destro non viene valutato se l'operando sinistro è vero.
Un'espressione and
si valuta valutando ciascun operando e convertendo
il rispettivo valore ad un booleano richiamando la funzione boolean. Il risultato è vero
se entrambi i valori sono veri, altrimenti è falso.
Non si valuta l'operatore destro se l'operatore sinistro è falso.
Una EqualityExpr
(che non è solo una RelationalExpr) o una RelationalExpr (che non è solo una AdditiveExpr) viene valutata confrontando gli oggetti
che vengono restituiti dalla valutazione dei due operandi.
Il confronto degli oggetti restituiti è definito nei successivi tre paragrafi.
Il primo paragrafo definisce i confronti che coinvolgono node-set in termini di confronti che non coinvolgono node-set; questo viene definito uniformente per
=
, !=
, <=
, <
,
>=
e >
. Nel secondo paragrafo i confronti che non coinvolgono node-set vengono definiti per
=
e !=
. Nel terzo i confronti che non coinvolgono node-set vengono definiti per
<=
, <
, >=
e >
.
Se tutti e due gli oggetti da comparare sono dei node-set, allora il confronto sarà vero se e solo se sono presenti e un nodo nel primo node-set e un nodo nel secondo node-set in modo che il risultato della comparazione su i string-value dei due nodi sia vero. Se un oggetto da comparare è un node-set e l'altro è un numero, allora il confronto sarà vero se e solo se è presente un nodo nel node-set tale che il risultato del confronto sul numero e sul risultato della conversione del string-value di quel nodo ad un numero utilizzando la funzione number sia vero. Se un oggetto da comparare è un node-set e l'altro è una stringa, allora il confronto sarà vero se e solo se è presente un nodo nel insieme nodo tale che il risultato della comparazione sul string-value del nodo e con l'altra stringa sia vero. Se un oggetto da comparare è un insieme nodo e l'altro è un booleano, allora il confronto sarà vero se e solo se il risultato della comparazione sul booleano e sul risultato della conversione del node-set ad un booleano usando la funzione boolean è vero.
Quando nessun oggetto da comparare è un insieme nodo e l'operatore è
=
o !=
, allora gli oggetti vengono confrontati convertendoli
ad un tipo comune come segue e poi confrontandoli. Se almeno un oggetto da comparare è un booleano,
allora ciascun oggetto da confrontare viene convertito ad un booleano come se fosse applicata la funzione boolean.
Altrimenti, se almeno un oggetto da comparare è un numero,
allora ciascun oggetto da confrontare viene convertito ad un
numero come se fosse applicata la funzione number.
Altrimenti tutte e due gli oggetti
da confrontare vengono convertiti a stringhe come se applicassimo la funzione string. Il confronto
=
sarà vero se e solo se gli oggetti sono uguali; il confronto
!=
sarà vero se e solo se gli oggetti non sono uguali. I numeri vengono confrontati
per uguaglianza secondo le IEEE 754 [IEEE 754]. Due booleani sono uguali
se o entrambi sono veri o entrambi sono falsi. Due stringhe sono uguali se e solo se sono costituite
dalla stessa sequenza di caratteri UCS
NOTA: Se$x
è legato ad un insieme nodo, allora$x="foo"
non ha il medesimo significato dinot($x!="foo")
: il primo è vero se e solo se qualche nodo nel$x
ha la string-valuefoo
; il secondo è vero se e solo se tutti i nodi nel$x
hanno lo string-valuefoo
.
Quando nessun oggetto da confrontare è un insieme nodo e l'operatore è
<=
, <
, >=
o >
,
allora gli oggetti vengono confrontati dalla conversione di entrambi gli oggetti a numeri e
confrontando i numeri secondo le IEEE 754. Il confronto <
sarà vero se e solo se il primo numero è minore del secondo numero.
Il confronto <=
sarà vero se e solo se il primo numero è minore
o uguale al secondo. Il confronto >
sarà vero
se e solo se il primo numero è più grande del secondo.
Il confronto >=
sarà vero se e solo se il primo numero è più grande o eguale
al secondo.
NOTA: Quando compare un'espressione XPath in un documento XML, ogni operatore<
e<=
deve essere codificato secondo le regole di XML 1.0 usando, ad esempio,<
e<=
. Nell'esempio seguente il valore dell'attributotest
è un'espressione XPath:<xsl:if test="@value < 10">...</xsl:if>
[21] | OrExpr | ::= | AndExpr | |
| OrExpr 'or' AndExpr | ||||
[22] | AndExpr | ::= | EqualityExpr | |
| AndExpr 'and' EqualityExpr | ||||
[23] | EqualityExpr | ::= | RelationalExpr | |
| EqualityExpr '=' RelationalExpr | ||||
| EqualityExpr '!=' RelationalExpr | ||||
[24] | RelationalExpr | ::= | AdditiveExpr | |
| RelationalExpr '<' AdditiveExpr | ||||
| RelationalExpr '>' AdditiveExpr | ||||
| RelationalExpr '<=' AdditiveExpr | ||||
| RelationalExpr '>=' AdditiveExpr |
NOTA: L'effetto della grammatica di cui sopra consiste che l'ordine della priorità è (prima la più bassa priorità)e gli operatori vengono tutti lasciati come associativi a sinistra. Ad esempio,
or
and
=
,!=
<=
,<
,>=
,>
3 > 2 > 1
è equivalente a(3 > 2) > 1
, che viene considerato falso.
Un numero rappresenta un numero a virgola mobile. Un numero può avere qualsiasi valore e doppia precisione 64-bit formato IEEE 754 [IEEE 754]. Queste specifiche includono un valore speciale "Not-a-Number" (NaN), l'infinito positivo e negativo e lo zero positivo e negativo. Vedi Section 4.2.3 del [JLS] per un riassunto delle regole chiave dello standard IEEE 754.
Gli operatori numerici convertono i rispettivi operandi in numeri come se si chiamasse la funzione number .
L'operatore +
esegue l'addizione.
L'operatore -
esegue la sottrazione.
NOTA: Poiché XML permette di usare-
nei nomi, l'operatore-
deve essere preceduto da uno spazio bianco. Ad esempio,foo-bar
equivale ad un insieme nodo che contiene gli elementi figli di nomefoo-bar
;foo - bar
equivale alla differenza del risultato di conversione ad un numero dello string-value del primo elemento figliofoo
e il risultato di conversione ad un numero dello string-value del primo figliobar
.
L'operatore div
realizza la divisione "floating-point" secondo le IEEE 754.
L'operatore mod
restituisce il resto da una divisione di troncamento. Ad esempio,
5 mod 2
restituisce 1
5 mod -2
restituisce 1
-5 mod 2
restituisce -1
-5 mod -2
restituisce -1
NOTA: Accade lo stesso con l'operatore %
in Java e in ECMAScript.
NOTA: Non è lo stesso con l'operazione resto IEEE 754, che restituisce il resto da una divisione arrotondata.
[25] | AdditiveExpr | ::= | MultiplicativeExpr | |
| AdditiveExpr '+' MultiplicativeExpr | ||||
| AdditiveExpr '-' MultiplicativeExpr | ||||
[26] | MultiplicativeExpr | ::= | UnaryExpr | |
| MultiplicativeExpr MultiplyOperator UnaryExpr | ||||
| MultiplicativeExpr 'div' UnaryExpr | ||||
| MultiplicativeExpr 'mod' UnaryExpr | ||||
[27] | UnaryExpr | ::= | UnionExpr | |
| '-' UnaryExpr |
Le stringhe sono costituite da una sequenza di zero o più caratteri, dove un carattere viene definito come nella raccomandazione XML [XML]. Di conseguenza un singolo carattere XPath corrisponde ad un singolo carattere astratto Unicode con un singolo valore scalare Unicode corrispondente (vedi [Unicode]); non è la stessa cosa che accade con il valore del codice 16-bit Unicode: la rappresentazione del carattere codificato Unicode per un carattere astratto con il valore scalare Unicode più grande del U+FFFF è una coppia di valori di codice 16-bit Unicode (una coppia surrogato). In molti linguaggi di programmazione, una stringa viene rappresentata da una sequenza di valori di codice 16-bit Unicode; le implementazioni di XPath in questi linguaggi devono assicurarsi che una coppia surrogato sia trattata correttamente come un singolo carattere XPath.
NOTA: E' possibile nell' Unicode che ci siano due stringhe che dovrebbero essere trattate come identiche anche se consistono di sequenze distinte di caratteri astratti Unicode . Ad esempio, alcuni caratteri accentati possono essere rappresentati sia in una forma precomposta che in una forma scomposta. Quindi le espressioni XPath possono restituire risultati inaspettati a meno che sia i caratteri nell'espressione XPath che quelli nel documento XML vengano normalizzati in una forma canonica. Vedi [Character Model].
Quando decomponiamo in token, si ottiene sempre il token più lungo possibile.
Per leggibilità, gli spazi bianchi possono essere utilizzati nelle espressioni anche se non vengono esplicitamente permessi dalla grammatica: ExprWhitespace possono essere liberamente aggiunte all'interno di patterns prima o dopo qualsiasi ExprToken.
Le particolari regole di divisione in token che seguono devono essere applicate nell'ordine specificato per togliere ambiguità alla grammatica ExprToken:
Se compare un preceding token e il preceding token non è uno di
@
, ::
, (
, [
,
,
o un Operator, allora un
*
deve essere riconosciuto come un MultiplyOperator e
un NCName deve essere riconosciuto come un OperatorName.
Se il carattere che segue un NCName (eventualmente dopo aver fatto intervenire ExprWhitespace) è una (
, allora il token deve essere riconosciuto come un NodeType o una FunctionName.
Se due caratteri che seguono NCName (eventualmente dopo aver fatto intervenire ExprWhitespace) sono
::
, allora il token deve essere riconosciuto come un AxisName.
Altrimenti il token non deve essere riconosciuto come un MultiplyOperator, un OperatorName, un NodeType, una FunctionName, o un AxisName.
[28] | ExprToken | ::= | '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::' | |
| NameTest | ||||
| NodeType | ||||
| Operator | ||||
| FunctionName | ||||
| AxisName | ||||
| Literal | ||||
| Number | ||||
| VariableReference | ||||
[29] | Literal | ::= | '"' [^"]* '"' | |
| "'" [^']* "'" | ||||
[30] | Number | ::= | Digits ('.' Digits?)? | |
| '.' Digits | ||||
[31] | Digits | ::= | [0-9]+ | |
[32] | Operator | ::= | OperatorName | |
| MultiplyOperator | ||||
| '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>=' | ||||
[33] | OperatorName | ::= | 'and' | 'or' | 'mod' | 'div' | |
[34] | MultiplyOperator | ::= | '*' | |
[35] | FunctionName | ::= | QName - NodeType | |
[36] | VariableReference | ::= | '$' QName | |
[37] | NameTest | ::= | '*' | |
| NCName ':' '*' | ||||
| QName | ||||
[38] | NodeType | ::= | 'comment' | |
| 'text' | ||||
| 'processing-instruction' | ||||
| 'node' | ||||
[39] | ExprWhitespace | ::= | S |
Questa sezione descrive delle funzioni che le implementazioni XPath devono sempre includere nella libreria delle funzioni che viene utilizzata per valutare le espressioni.
Ciascuna funzione nella libreria è specificata usando un prototipo di funzione, che dà il tipo di ritorno, il nome della funzione, e il tipo degli argomenti. Se un tipo di argomento è seguito da un punto interrogativo, allora l'argomento è opzionale ; in caso contrario, è richiesto l' argomento.
La funzione last restituisce un numero uguale al context size dal contesto di valutazione dell'espressione.
La funzione position restituisce un numero uguale al context position dal contesto di valutazione dell'espressione.
Function: number count(node-set)
La funzione count restituisce il numero dei nodi nell'argomento del node-set.
La funzione id seleziona gli elementi secondo il loro unico ID (vedi [5.2.1 Unique IDs]). Quando l'argomento id è un node-set, il risultato è l'unione o somma del risultato derivato dall'applicazione di (o del valore) id allo string-value di ciascuno dei nodi nell'argomento del node-set. Quando l'argomento id è uno degli altri tipi , l'argomento viene convertito ad una stringa come se chiamasse la funzione string; la stringa è divisa in una lista di token separati da whitespace (è una qualsiasi sequenza di caratteri che incontrano la produzione S); il risultato è un node-set che contiene gli elementi nello stesso documento come il context node che ha un unico ID equivalente a uno qualsiasi dei token nella lista.
id("foo")
seleziona l'elemento con un unico ID foo
id("foo")/child::para[position()=5]
seleziona
il quinto figlio para
dell'elemento un unico ID foo
Function: string local-name(node-set?)
La funzione local-name restituisce la parte locale dell' expanded-name del nodo nell'argomento del node-set che è il primo nel document order. Se l'argomento del node-set è vuoto o il primo nodo non ha expanded-name, viene restituita una stringa vuota. Se l'argomento viene omesso, rimane di default il node-set con il context node come suo unico membro.
Function: string namespace-uri(node-set?)
La funzione namespace-uri restituisce il namespace URI dell' expanded-name del nodo nell'argomento del node-set che è primo nel document order. Se l'argomento del node-set è vuoto, il primo nodo non ha nessun expanded-name, o se il namespace URI dell' expanded-name è nullo, viene restituta una stringa vuota. Se viene omesso l'argomento, rimane di default il node-set con il context node come suo unico membro.
NOTA: La stringa restituita dalla funzione namespace-uri sarà vuota eccetto per gli element-node e gli attribute-node.
Function: string name(node-set?)
La funzione name restituisce una stringa contenente un QName che rappresenta l'expanded-name del nodo nell'argomento del node-set che è primo nel document order. Il QName deve rappresentare l' expanded-name secondo le dichiarazioni namespace del nodo di cui l' expanded-name viene rappresentato. Tipicamente questo sarà il QName che compare nella sorgente XML. Questo non è il caso ove siano presenti delle dichiarazioni namespace sul nodo che associno prefissi multipli con i medesimi namespaces. Comunque, un'implementazione può includere l'informazione sul prefisso originale nella rappresentazione dei nodi; in questo caso, un'implementazione può assicurare che la stringa restituita sia sempre la stessa del QName che viene utilizzato nella sorgente XML. Se l'argomento del node-set è vuoto o il primo nodo non ha nessun expanded-name, viene restituita una stringa vuota. Se l'argomento viene omesso, rimane di default il node-set con il context node come suo unico membro.
NOTA: La stringa restituita dalla funzione name sarà la stessa della stringa restituita dalla funzione local-name eccetto per i nodi elemento e i nodi attributo.
Function: string string(object?)
La funzione string converte un oggetto in una stringa nel modo seguente:
Un insieme nodo viene convertito in una stringa restituendo il string-value del nodo nell' insieme nodo che compare per primo nel document order. Se il insieme nodo è vuoto, viene restituita una stringa vuota.
Un numero viene convertito in una stringa nel modo seguente:
NaN viene convertito in una stringa NaN
zero positivo viene convertito nella stringa 0
zero negativo viene convertito nella stringa 0
infinito positivo viene convertito nella stringa Infinity
nfinito negativo viene convertito nella stringa -Infinity
se il numero è un intero, il numero viene rappresentato in forma decimale come un Number
senza virgola decimale e senza zero in testa, preceduto da un segno meno (-
) se il numero è negativo
altrimenti il numero viene rappresentato in forma decimale come un Number che include la virgola decimale con almeno una cifra prima della virgola decimale
e almeno una cifra dopo la virgola decimale, preceduto dal segno meno (-
) se il numero è negativo;
non ci devono essere zero in testa prima della virgola decimale a parte eventualmente la cifra richiesta
immediatamente prima della virgola decimale; oltre alla cifra richiesta dopo la cifra decimale
ce ne devono essere solo tante quante sono quelle richieste per distinguere il numero dagli altri valori numerici
IEEE 754.
Il valore booleano falso viene convertito nella stringa false
. Il valore booleano vero
viene convertito nella stringa true
.
Un oggetto di un tipo che sia diverso da i quattro fondamentali viene convertito in una stringa in un modo che sia dipendente da quel tipo.
Se viene omesso l'argomento, rimane di default il node-set con il context node come suo unico membro.
NOTA: La funzionestring
non è concepita per convertire i numeri in stringhe per la presentazione ad utenti. La funzioneformat-number
e l'elementoxsl:number
nel [XSLT] forniscono questa funzionalità.
Function: string concat(string, string, string*)
La funzione concat restituisce la concatenazione dei suoi argomenti.
Function: boolean starts-with(string, string)
La funzione starts-with restituisce vero se il primo argomento stringa inizia con un secondo argomento stringa, altrimenti restituisce falso.
Function: boolean contains(string, string)
La funzione contains restituisce vero se il primo argomento stringa contiene il secondo argomento stringa, altrimenti restituisce falso.
Function: string substring-before(string, string)
La funzione substring-before
restituisce le sottostringhe del primo argomento stringa che precede la prima
comparsa del secondo argomento nel primo argomento stringa, oppure la
stringa vuota se il primo argomento stringa non contiene il secondo argomento
stringa. Ad esempio, substring-before("1999/04/01","/")
restituisce 1999
.
Function: string substring-after(string, string)
La funzione substring-after
restituisce la sottostringa del primo argomento stringa che segue la prima
comparsa del secondo argomento stringa nel primo argomento stringa, oppure
la stringa vuota se il primo argomento stringa non contiene il secondo argomento
stringa. Ad esempio, substring-after("1999/04/01","/")
restituisce 04/01
, e substring-after("1999/04/01","19")
restituisce 99/04/01
.
Function: string substring(string, number, number?)
La funzione substring
restituisce la sottostringa del primo argomento partendo dalla posizione specificata nel
secondo argomento con lunghezza specificata nel terzo argomento.
Ad esempio,substring("12345",2,3)
restituisce "234"
.Se il
terzo argomento non viene specificato, restituisce la sottostringa partendo
dalla posizione specificata nel secondo argomento continuando fino alla fine della
stringa. Ad esempio, substring("12345",2)
restituisce "2345"
.
Più precisamente si considera che ciascun carattere nella stringa (vedi [3.6 Stringhe]) abbia una posizione numerica: la posizione del primo carattere è 1, la posizione del secondo carattere è 2 e così via.
NOTA: Questo
differisce da Java e ECMAScript, nel quale
il metodo String.substring
considera la posizione del primo carattere
come 0.
La sottostringa restituita contiene quei caratteri per i quali la posizione del carattere è maggiore o uguale al valore arrotondato del secondo argomento e minore della somma tra il valore arrotondato del secondo argomento e il valore arrotondato del terzo argomento, se viene specificato il terzo argomento: i confronti e l'addizione utilizzati qui sopra seguono le regole dello standard IEEE 754 ; l'arrotondamento viene eseguito utilizzando la funzione round. Gli esempi seguenti illustrano alcuni casi poco frequenti:
substring("12345", 1.5, 2.6)
restituisce "234"
substring("12345", 0, 3)
restituisce "12"
substring("12345", 0 div 0, 3)
restituisce ""
substring("12345", 1, 0 div 0)
restituisce ""
substring("12345", -42, 1 div 0)
restituisce "12345"
substring("12345", -1 div 0, 1 div 0)
restituisce ""
Function: number string-length(string?)
La funzione string-length restituisce il numero dei caratteri nella stringa (vedi [3.6 Stringhe]). Se l'argomento viene omesso, rimane di default il context node convertito ad una stringa, in altre parole il string-value del context node.
Function: string normalize-space(string?)
La funzione normalize-space restituisce l'argomento stringa togliendo gli spazi bianchi all'inizio e alla fine e rimpiazzando sequenze di caratteri bianchi con un singolo spazio. I caratteri spazi bianchi sono i medesimi che compaiono nella produzione S in XML. Se l'argomento viene omesso, rimane di default il context node convertito in una stringa, in altre parole la string-value del context node.
Function: string translate(string, string, string)
La funzione translate
restituisce il primo argomento stringa con le ricorrenze dei caratteri della stringa del secondo argomento
rimpiazzate dal carattere che si trova nella stringa del terzo argomento alla posizione corrispondente.
Ad esempio, translate("bar","abc","ABC")
restituisce la stringa BAr
. Se è presente un carattere nella stringa del secondo argomento
con nessun carattere nella posizione corrispondente nella stringa del terzo argomento
(perché la stringa del secondo argomento è più lunga della stringa del terzo),
allora le occorrenze di quel carattere nella stringa del primo argomento vengono rimosse.
Ad esempio, translate("--aaa--","abc-","ABC")
restituisce "AAA"
. Se un carattere occorre più di una volta nella stringa del secondo argomento, allora la
prima occorrenza determina il carattere di sostituzione. Se la stringa del terzo argomento
é più lunga della stringa del secondo, allora vengono ignorati i caratteri in eccesso.
NOTA: La funzione translate non è una soluzione sufficiente per la conversione maiuscolo-minuscolo in tutte le lingue. Una versione futura di XPath potrà fornire funzionalità aggiuntive per questo caso.
Function: boolean boolean(object)
La funzione boolean converte il suo argomento in un booleano come segue:
un numero è vero se, e solo se, non è né un zero positivo né negativo e neppure NaN
un insieme nodo è vero se e solo se è non-vuoto
una stringa è vero se e solo se la sua lunghezza non è uguale a zero
un oggetto di un tipo diverso da i quattro tipi base viene convertito in un booleano in modo dipendente da quel tipo
Function: boolean not(boolean)
La funzione not restituisce vero se il suo argomento è falso, e falso in caso contrario.
La funzione true restituisce vero.
La funzione false restituisce falso.
Function: boolean lang(string)
La funzione lang
restituisce vero o falso a seconda che il linguaggio del context node come specificato
da gli attributi xml:lang
, sia lo stesso oppure sia un sottolinguaggio
del linguaggio specificato dall'argomento stringa. Il linguaggio del context node
viene determinato dal valore dell'attributo xml:lang
del context node, oppure, se il context node non ha attributo
xml:lang
, dal valore dell'attributo xml:lang
dell'antenato più vicino del context node che ha un attributo
xml:lang
. Se non esiste tale attributo, allora lang restituisce falso. Se esiste tale attributo, allora lang restituisce vero se il valore dell'attributo è
uguale all'argomento ignorando la trasformazione maiuscolo-minuscolo, oppure se esiste un suffisso che inizia
con -
tale che il valore dell'attributo sia uguale all'argomento ignorando il
suffisso del valore dell'attributo e della trasformazione maiuscolo-minuscolo.
lang("en")
restituirebbe vero se il context node fosse qualsiasi di
questi cinque elementi:
<para xml:lang="en"/> <div xml:lang="en"><para/></div> <para xml:lang="EN"/> <para xml:lang="en-us"/>
Function: number number(object?)
La funzione number converte il suo argomento in un numero come segue:
una stringa che è composta da spazi bianchi opzionali seguita da un segno meno opzionale seguito da un Number seguito da uno spazio bianco viene convertita ad un numero IEEE 754 che è il più vicino (secondo la regola IEEE 754 "round-to-nearest") ad un valore matematico rappresentato da una stringa; qualsiasi altra stringa viene convertita a NaN
un booleano vero viene convertito a 1; un booleano falso viene convertito a 0
un insieme nodo è prima convertito ad una stringa secondo la funzione string e poi convertito allo stesso modo come un argomento stringa
un oggetto di un tipo diverso da i quattro fondamentali viene convertito ad un numero nel modo in cui dipende da quel tipo.
Se l'argomento viene omesso, è di default l'insieme nodo con il context node come suo unico membro.
NOTA: Non si dovrebbe utilizzare la funzione number per la conversione di dati numerici che compaiono in un elemento all'interno di un documento XML a meno che l'elemento non sia del tipo che rappresenta dati numerici in un formato language-neutral (che verrebbe solitamente transformato in un formato di linguaggio specifico per la rappresentazione ad un utente). Inoltre la funzione number non può essere utilizzata a meno che il formato indipendente dal linguaggio usato dall'elemento segua la sintassi XPath per un Number.
Function: number sum(node-set)
La funzione sum restituisce la somma, per ciascun nodo nell' argomento dell' insieme nodo, del risultato della conversione del string-value del nodo in un numero.
La funzione floor restituisce il numero più alto (il più vicino all'infinito positivo) che non sia maggiore dell'argomento e che sia un intero.
Function: number ceiling(number)
La funzione ceiling restituisce il numero più basso (il più vicino ad un infinito negativo) che non sia minore dell'argomento e che sia un intero.
Function: number round(number)
La funzione round restituisce il numero che è più vicino all'argomento e che è intero. Se esistono due numeri di questo tipo, allora viene restituito quello che più vicino all'infinito positivo. Se l'argomento è NaN, allora viene restituito NaN. Se l'argomento è infinito positivo, allora viene restituito infinito positivo. Se l'argomento è infinito negativo, allora viene restituito infinito negativo. Se l'argomento è zero positivo, allora viene restituito zero positivo. Se l'argomento è zero negativo, allora viene restituito zero negativo. Se l'argomento è minore di zero, ma maggiore o uguale a -0.5, allora viene restituito zero negativo.
NOTA: Per questi due ultimi casi, il risultato della chiamata della funzione round non è lo stesso del risultato che deriva dall'addizionare 0.5 per poi utilizzare la funzione floor.
Questa sezione descrive come XPath opera su un documento XML come un albero. Questo modello è solo concettuale e non demanda a nessuna particolare implementazione. La relazione di questo modello con XML Information Set [XML Infoset] viene descritta nel [B XML Information Set Mapping].
I documenti XML elaborati da XPath devono essere conformi alle XML Namespaces Recommendation [XML Names].
L'albero contiene dei nodi. Esistono sette tipologie di nodi:
nodi radice
nodi elemento
nodi testo
nodi attributo
nodi namespace
nodi istruzioni di processo
nodi commento
Per ciascun tipo di nodo, c'è il modo di determinare un string-value per un nodo di quel tipo. Per alcuni tipi di nodo, lo string-value è parte del nodo; per gli altri tipi, lo string-value è calcolato dallo string-value dei nodi discendenti.
NOTA: Per i nodi elemento e i nodi radice, il string-value di un nodo non è lo stesso della stringa che viene restituita
dal metodo DOM nodeValue
(vedi [DOM]).
Alcuni tipi di nodi hanno anche un expanded-name, che è una coppia costituita da una parte locale e da un namespace URI. La parte locale è una stringa. Il namespace URI può essere sia nullo sia una stringa. Il namespace URI specificato nel documento XML può essere un riferimento URI come viene definito nel [RFC2396]; questo sta a significare che può avere un identificatore di frammenti e che può essere relativo. Un URI relativo dovrebbe essere risolto in un URI assoluto durante l'elaborazione namespace: i namespace URI dell' expanded-name dei nodi nel data model dovrebbero essere assoluti. Due expanded-name sono uguali se hanno la stessa parte locale e se hanno entrambi un namespace URI nullo o un uguale namespace URI non nullo.
Esiste un ordinamento, il document order, definito da tutti i nodi nel documento come corrispondente all'ordine nel quale il primo carattere della rappresentazione XML di ciascun nodo compare dopo l'espansione delle entità generali. Quindi, il nodo radice sarà il primo nodo. I nodi elemento compariranno prima dei rispettivi figli. Quindi, il document order ordina i nodi elemento secondo l'ordine delle riccorrenze dei loro tag d'inizio nel XML (dopo l'espansione delle entità). I nodi attributo e i nodi namespace di un elemento compaiono prima dei figli dell'elemento. I nodi namespace vengono definiti per apparire prima dei nodi attributo. L'ordine relativo dei nodi namespace dipende dall'implementazione. L'ordine relativo dei nodi attributo dipende dall'implementazione. Il Reverse document order è il contrario del document order .
I nodi radice e i nodi elemento hanno una lista ordinata di nodi figli. I nodi non hanno mai in condivisione figli: se un nodo è diverso da un altro, nessuno dei figli dell'uno sarà uguale ad alcuno dei figli dell'altro. Ciascun nodo diverso dall'elemento radice ha esattamente un parent, che è o nodo elemento o nodo radice. Un nodo radice o un nodo elemento è il genitore di ciascuno dei suoi nodi figlio. I descendants di un nodo sono i figli del nodo e i discendenti dei figli del nodo.
Il nodo radice è la radice dell'albero. Un nodo radice non compare eccetto che come radice dell'albero. Il nodo elemento per l'elemento documento è un figlio del nodo radice. Il nodo radice ha anche come figli delle istruzioni di processo e dei nodi commento per istruzioni di processo e commenti che occorrono nel prologo e dopo la fine dell'elemento documento.
Il string-value del nodo radice è la concatenazione del string-value di tutti i nodi testo descendants del nodo radice nell'ordine del documento.
Il nodo radice non ha un expanded-name.
Esiste un nodo elemento per ciascun elemento del documento. Un nodo elemento ha un expanded-name valutato espandendo il QName dell' elemento specificato nel tag secondo le XML Namespaces Recommendation [XML Names]. Il namespace URI dell' expanded-name degli elementi saranno nulli se il QName non ha prefisso e non esistono namespace di default applicabili.
NOTA: Nell' annotazione dell'Appendice A.3 del [XML Names], la parte locale dell'expanded-name corrisponde all'attributotype
dell'elementoExpEType
; il namespace URI dell' expanded-name corrisponde all'attributons
dell'elementoExpEType
, ed è nullo se viene omesso l'attributons
dell'elementoExpEType
.
I figli di un nodo elemento sono i nodi elemento, i nodi commento, i nodi processo di elaborazione ed i nodi testo del rispettivo contenuto. I riferimenti ad entità vengono espansi sia alle entità interne che esterne. I riferimenti a caratteri vengono risolti.
Il string-value di un nodo elemento è la concatenazione del string-value di tutti i nodi testodescendants del nodo elemento nell'ordine del documento.
Un nodo elemento può avere un unico identificatore (ID). Questo è il valore dell'attributo
che è dichiarato nella DTD come tipo ID
. Due elementi
non possono avere in un documento lo stesso unico ID. Se un processore XML elabora due
elementi in un documento con il medesimo unico ID (che è possibile solo se il documento non è valido)
allora il secondo elemento nell'ordine del documento dovrà essere
trattato come se non avesse un unico ID.
NOTA: Se un documento non ha un DTD, allora nessun elemento nel documento avrà un unico ID.
Ciascun nodo elemento ha un insieme associato di nodi attributo; l'elemento è il parent di ciascuno di questi nodi attributo; tuttavia, un nodo attributo non è figlio del suo elemento genitore.
NOTA: Questo differisce dal DOM, che non considera l'elemento che porta un attributo come il genitore dell' attributo (vedi [DOM]).
Gli elementi non condividono mai i nodi attributo: se due nodi elemento sono diversi, allora nessuno dei nodi attributo di uno sarà lo stesso nodo attributo dell'altro.
NOTA: L'operatore=
verifica se due nodi hanno lo stesso valore non se sono lo stesso nodo. Quindi gli attributi di due elementi diversi possono essere considerati come uguali usando=
, anche se non appartengono allo stesso nodo.
Un attributo di default viene trattato allo stesso modo di un attributo specificato. Se si
dichiara un attributo per il tipo elemento nel DTD, ma il valore di default
viene dichiarato come #IMPLIED
, e non si specifica l'attributo dell'
elemento, allora l'insieme attributo dell'elemento non contiene un nodo per l'attributo.
Alcuni attributi, come xml:lang
e xml:space
,
hanno la semantica che applicano a tutti gli elementi discendenti dell'elemento che porta l'
attributo, a meno che non sia sovrapposto da una istanza del medesimo attributo su un
altro elemento discendente. Tuttavia, questo non influisce ove i nodi attributo compaiono
in un albero: un elemento ha dei nodi attributo solo per gli attributi che sono stati
esplicitamente specificati nel tag d'inizio o nel tag dell'elemento vuoto di quell'elemento o
che sono stati esplicitamente dichiarati nel DTD con un valore di default.
Un nodo attributo ha un expanded-name e un string-value. L' expanded-name viene calcolato espandendo QName specificato nel tag nel documento XML secondo le specifiche XML Namespaces [XML Names]. Il namespace URI del nome dell'attributo sarà nullo se il QName dell'attributo non ha prefisso.
NOTA: Nella notazione dell'Appendice A.3 di [XML Names], la parte locale dell'expanded-name corrisponde all'attributoname
dell'elementoExpAName
; il namespace URI dell'expanded-name corrisponde all'attributons
dell'elementoExpAName
, ed è nullo se viene omesso l'attributons
dell'elementoExpAName
.
Un nodo attributo ha un string-value. Il string-value è il valore normalizzato come specificato dalle Recommandation XML [XML]. Un attributo, il cui valore normalizzato é una stringa di lunghezza zero, non è trattato in modo speciale: si risolve in un nodo attributo il cui attributo string-value è una stringa di lunghezza zero.
NOTA: E' possibile che gli attributi di default vengano dichiarati in in una DTD esterna o in una entità parametrica esterna. Le Recommandation XML non richiedono un processore XML per leggere una DTD esterna o un parametro esterno a meno che non sia validante. Un foglio di stile o un'altra facilitazione che assuma che l'albero XPath contenga i valori degli attributi di default dichiarati in un DTD esterno o in una entità parametrica non può lavorare con alcuni processori XML non validanti .
Non esistono nodi attributo che corrispondono ad attributi che dichiarano namespaces ( vedi [XML Names]).
Ciascun elemento ha un insieme associato di nodi namespace, uno per
ciascun prefisso distinto namespace, che è finalizzato all'elemento (includendo il prefisso
xml
, che è implicitamente dichiarato dalle Recommandation XML Namespaces
[XML Names])
e uno per il namespace di default se è finalizzato all'elemento. L'elemento è il parent
di ciascuno di questi nodi namespace; tuttavia,
un nodo namespace non è un figlio del suo elemento genitore. Gli elementi non condividono mai
i nodi namespace: se il nodo elemento uno non è lo stesso nodo come un altro nodo elemento,
allora nessuno dei nodi namespace del nodo elemento uno sarà lo stesso nodo come il nodo namespaces di un altro nodo elemento.
Questo significa che un elemento avrà un nodo namespace:
per ogni attributo dell'elemento il cui nome inizia con xmlns:
;
per ogni attributo sull'elemento antenato il cui nome inizia con
xmlns:
a meno che l'elemento stesso o il discendente più vicino ridichiari il prefisso;
Per un attributo xmlns
, se l'elemento o alcuni antenati hanno un attributo
xmlns
, e il valore dell'attributo xmlns
per il più di tali elementi non vuoto.
NOTA: Un attributo xmlns=""
non dichiara
il namespace di default (vedi [XML
Names]).
Un nodo namespace ha un expanded-name: la parte locale è il prefisso namespace (questo è vuoto se il nodo namespace è il default namespace); il namespace URI è sempre nullo.
Il string-value di un nodo namespace è il namespace URI che è legato al prefisso namespace; se è relativo, deve essere risolto proprio come un namespace URI in un expanded-name.
Esiste un nodo istruzioni di processo per ogni istruzioni di processo, ad eccezione di ogni istruzione di processo che compaia all'interno della document type declaration.
Una istruzione di processo ha un expanded-name: la parte locale
è la finalità della istruzione di processo; il namespace URI è nullo. Il string-value di un nodo istruzione di processo
è la parte della istruzione di processo che segue la finalità e ogni spazio bianco.
Non include il?>
.
NOTA: La dichiarazione XML non è una istruzione di processo. Perciò non esiste un nodo istruzione di processo che corrisponda alla dichiarazione XML.
Esiste un nodo commento per ciascun commento, ad eccezione di ogni commento che compaia all'interno del document type declaration.
Il string-value del commento è il contenuto del
commento che non include in apertura
<!--
o in chiusura -->
.
Un nodo commento non ha un expanded-name.
Character data vengono raggruppati in nodi testo. I character data vengono raggruppati il più possibile in nel nodo testo: un nodo testo non ha mai un un nodo testo fratello che lo segua o lo preceda immediatamente. Il string-value di un nodo testo è il character data. Un nodo testo ha sempre almeno un character data.
Ciascun carattere all'interno di una sezione CDATA viene trattato come character data. Quindi,
<![CDATA[<]]>
nella sorgente documento verrà trattata allo stesso modo di
<
. Entrambi compariranno in un singolo carattere<
in un nodo testo nell'albero. Quindi, una sezione CDATA viene trattata come se venissero rimossi il
<![CDATA[
e il ]]>
e ogni riccorrenza di <
e &
venissero rimpiazzati rispettivamente
da <
e &
.
NOTA: Quando un nodo testo che contiene un carattere<
viene evidenziato come XML, il carattere<
viene aggirato usando, ad esempio,<
, o includendolo in una sezione CDATA.
I Caratteri all'interno dei commenti, delle istruzioni di processo e dei valori degli attributi non producono dei nodi testo. Line-endings nelle entità esterne vengono normalizzati a #xA come specificato nella Recommandation XML [XML].
Un nodo testo non ha un expanded-name.
XPath viene concepito in prima istanza come un componente che può essere utilizzato per altre specifiche. Quindi, XPath si basa su specifiche che usano XPath (come [XPointer] e [XSLT]) per chiarire criteri di conformità delle implementazioni di XPath e non definisce nessun criterio di conformità per le implementazioni independenti da XPath.
I nodi nel modello dei dati di XPath possono provenire da information items forniti dal XML Information Set [XML Infoset] come segue:
NOTA: Una nuova versione del XML Information Set Working Draft, che sostituirà la versione del 17 Maggio, era in fase di completamento nel periodo in cui fu finita la preparazione di questa versione di XPath. Si attendeva che venisse pubblicata nello stesso periodo o poco dopo la pubblicazione di questa versione di XPath. E' disponibile la mappatura di questa nuova versione del XML Information Set Working Draft e nel caso che la nuova versione di XML Information Set Working non sia stata ancora pubblicata, i membri del W3C possono consultare la versione interna del Working Group http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html (members only).
Il nodo radice proviene dal document information item. I figli del nodo radice provengono dai children e children - comments e dalle proprietà.
Un nodo elemento proviene da un element information item. I figli di un nodo elemento provengono dalle proprietà children e children - comments
. Gli attributi di un nodo elemento provengono dalle proprietà degli attributes
. I namespaces di un nodo elemento provengono dalla proprietà in-scope namespaces .
La parte locale dell' expanded-name del nodo elemento proviene dalla
proprietà del local name. Il namespace URI dell' expanded-name del nodo elemento
proviene dalla proprietà dei namespace URI. L'ID unico del nodo elemento proviene dalla proprietà del
children dell'attribute information
item nella proprietà attributes che ha una proprietà attribute
type uguale a ID
.
Un nodo attributo proviene da un attribute information item. La parte locale dell' expanded-name del nodo attributo proviene dalla proprietà del local name. Il namespace URI dell' expanded-name del nodo attributo proviene dalla proprietà del namespace URI . Il string-value del nodo proviene dal concatenamento della proprietà del character code di ciascun membro della proprietà dei children .
Un nodo testo proviene da una sequenza di uno e più consecutivi character information item. Il string-value del nodo proviene dal concatenamento della proprietà del character code di ciascuno dei character information items.
Un nodo processing instruction proviene da processing instruction information item. La parte locale dell' expanded-name del nodo proviene dalla proprietà del target . (Il namespace URI parte dell' expanded-name del nodo è nullo). Il string-value del nodo proviene dalla proprietà content . Non esistono nodi processing instruction per elaborare i processing instruction items che sono figli del document type declaration information item.
Un nodo commento node proviene da un comment information item. Il string-value del nodo proviene dalla proprietà content. Non ci sono nodi commento per i comment information items che sono figli del document type declaration information item.
Un nodo namespace deriva da una namespace declaration information item. La parte locale dell' expanded-name del nodo proviene dalla proprietà prefix . (Il namespace URI parte dell' expanded-name del nodo è nullo.) Il string-value del nodo deriva dalla proprietà namespace URI.