Usar sintaxis abreviada en una expresión de ruta de acceso
Todos los ejemplos de expresiones de ruta de acceso (XQuery) utilizan sintaxis no abreviada para expresiones de ruta de acceso. La sintaxis no abreviada para un paso de eje en una expresión de ruta de acceso incluye el nombre del eje y la prueba de nodo, separados por dos puntos dobles, y seguidos por cero o más calificadores de paso.
Por ejemplo:
child::ProductDescription[attribute::ProductModelID=19]
XQuery admite las siguientes abreviaturas para usarlas con expresiones de ruta de acceso:
El eje child es el predeterminado. Por consiguiente, el eje child:: se puede omitir de un paso en una expresión. Por ejemplo, /child::ProductDescription/child::Summary puede escribirse como /ProductDescription/Summary.
Un eje attribute puede abreviarse como @. Por ejemplo, /child::ProductDescription[attribute::ProductModelID=10] puede escribirse como /ProudctDescription[@ProductModelID=10].
/descendant-or-self::node()/ puede abreviarse como //. Por ejemplo, /descendant-or-self::node()/child::act:telephoneNumber puede escribirse como //act:telephoneNumber.
La consulta anterior recupera todos los números de teléfono almacenados en la columna AdditionalContactInfo de la tabla Contact. El esquema para AdditionalContactInfo se define de manera que el elemento <telephoneNumber> puede aparecer en cualquier lugar del documento. Por tanto, para recuperar todos los números de teléfono, debe buscar cada nodo del documento. Esta búsqueda se inicia en la raíz del documento y continúa en todos los nodos descendientes.
La consulta siguiente recupera todos los números de teléfono para un contacto de cliente específico:
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.Contact WHERE ContactID=1
Si reemplaza la expresión de ruta de acceso por la sintaxis abreviada, //act:telephoneNumber, obtendrá los mismos resultados.
self::node() en un paso puede abreviarse con un punto (.). No obstante, el punto no es equivalente a self::node() ni se puede intercambiar.
Por ejemplo, en la consulta siguiente, el uso de un punto representa un valor y no un nodo:
("abc", "cde")[. > "b"]
parent::node() en un paso puede abreviarse con un punto doble (..).