Condividi tramite


Utilizzo della sintassi abbreviata in un'espressione di percorso

In tutti gli esempi contenuti in Espressioni di percorso (XQuery) viene utilizzata la sintassi abbreviata per le espressioni di percorso. La sintassi non abbreviata per un passo dell'asse in un'espressione di percorso include il nome dell'asse e il test di nodo, separati da una coppia di due punti e seguiti da zero o più qualificatori di passo.

Ad esempio:

child::ProductDescription[attribute::ProductModelID=19]

Nelle espressioni di percorso, XQuery supporta le abbreviazioni seguenti:

  • L'asse child è l'asse predefinito. Pertanto, è possibile omettere l'asse child:: da un passo di un'espressione. Ad esempio, è possibile scrivere /child::ProductDescription/child::Summary nel formato /ProductDescription/Summary.

  • È possibile abbreviare un asse attribute utilizzando @. Ad esempio, è possibile scrivere /child::ProductDescription[attribute::ProductModelID=10] nel formato /ProudctDescription[@ProductModelID=10].

  • È possibile abbreviare /descendant-or-self::node()/ utilizzando //. Ad esempio, è possibile scrivere /descendant-or-self::node()/child::act:telephoneNumber nel formato //act:telephoneNumber.

    La query precedente recupera tutti i numeri di telefono archiviati nella colonna AdditionalContactInfo della tabella Contact. Lo schema per la colonna AdditionalContactInfo viene definito in modo che sia possibile inserire un elemento <telephoneNumber> in qualsiasi posizione all'interno del documento. Per recuperare tutti i numeri di telefono, pertanto, è necessario eseguire la ricerca in ogni nodo del documento. La ricerca inizia alla radice del documento e continua in tutti i nodi discendenti.

    La query seguente recupera tutti i numeri di telefono relativi a un contatto di un cliente specifico:

     SELECT AdditionalContactInfo.query('           
                 declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";           
                 declare namespace crm="http://schemas.adventure-works.com/Contact/Record";           
                 declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";           
                 /descendant-or-self::node()/child::act:telephoneNumber           
                 ') as result           
     FROM Person.Person           
     WHERE BusinessEntityID = 291;           
    

    Se si sostituisce l'espressione di percorso con la sintassi abbreviata //act:telephoneNumber, si ottengono gli stessi risultati.

  • È possibile abbreviare self::node() in un passo utilizzando un punto singolo (.). Tuttavia, il punto non è equivalente o interscambiabile con self::node().

    Ad esempio, nella query seguente, l'utilizzo di un punto rappresenta un valore e non un nodo:

    ("abc", "cde")[. > "b"]
    
  • È possibile abbreviare parent::node() in un passo utilizzando una coppia di punti (..).