Expresiones de ruta de acceso: Especificación de ejes
Se aplica a:SQL Server
Un paso de eje de una expresión de ruta de acceso incluye los siguientes componentes:
Para obtener más información, vea Expresiones de ruta de acceso (XQuery).
La implementación de XQuery en SQL Server admite los siguientes pasos del eje,
Eje | Descripción |
---|---|
secundario | Devuelve elementos secundarios del nodo de contexto. |
descendant | Devuelve todos los descendientes del nodo de contexto. |
parent | Devuelve el elemento primario del nodo de contexto. |
attribute | Devuelve atributos del nodo de contexto. |
propio | Devuelve el propio nodo de contexto. |
descendiente o propio | Devuelve el nodo de contexto y todos los descendientes del mismo. |
Todos estos ejes, excepto el eje primario , son ejes hacia delante. El eje primario es un eje inverso, ya que busca hacia atrás en la jerarquía de documentos. Por ejemplo, la expresión de ruta de acceso relativa child::ProductDescription/child::Summary
tiene dos pasos, y cada uno especifica un eje child
. El primer paso recupera los <elementos secundarios productDescription> del nodo de contexto. Para cada <nodo de elemento ProductDescription> , el segundo paso recupera los elementos secundarios del <nodo elemento Summary> .
La expresión de ruta de acceso relativa, child::root/child::Location/attribute::LocationID
, tiene tres pasos. Cada uno de los dos primeros especifica un eje child
y el tercero especifica el eje attribute
. Cuando se ejecuta en los documentos XML de instrucciones de fabricación de la tabla Production.ProductModel , la expresión devuelve el LocationID
atributo del <nodo del elemento Location> secundario del <elemento raíz> .
Ejemplos
Los ejemplos de consulta de este tema se especifican en columnas de tipo xml en la base de datos AdventureWorks .
A. Especificar un eje child
Para un modelo de producto específico, la consulta siguiente recupera los elementos secundarios del <nodo del elemento Features> del <nodo elemento ProductDescription> de la descripción del catálogo de productos almacenada en la Production.ProductModel
tabla.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/child::PD:ProductDescription/child::PD:Features')
FROM Production.ProductModel
WHERE ProductModelID=19
Observe lo siguiente en la consulta anterior:
El
query()
método del tipo de datos xml especifica la expresión de ruta de acceso.Ambos pasos de la expresión de ruta de acceso especifican un eje
child
y los nombres de nodo,ProductDescription
yFeatures
, como pruebas de nodo. Para obtener información sobre las pruebas de nodo, vea Especificar prueba de nodo en un paso de expresión de ruta de acceso.
B. Especificar ejes descendant y descendant-or-self
En el ejemplo siguiente se utilizan ejes descendant y descendant-or-self. La consulta de este ejemplo se especifica en una variable de tipo xml . Se ha simplificado la instancia XML para ilustrar claramente la diferencia en los resultados generados.
declare @x xml
set @x='
<a>
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
</a>'
declare @y xml
set @y = @x.query('
/child::a/child::b
')
select @y
En el resultado siguiente, la expresión devuelve el nodo de elemento secundario <b>
del nodo de elemento <a>
:
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
En esta expresión, si especifica un eje descendant para la expresión de ruta de acceso,
/child::a/child::b/descendant::*
, se le pide a todos los descendientes del nodo de <b
> elemento.
El asterisco (*) en la prueba de nodo representa el nombre del nodo como prueba de nodo. Por tanto, el tipo de nodo principal del eje descendant, el nodo de elemento, determina los tipos de nodos devueltos. Es decir, la expresión devuelve todos los nodos de elemento. No se devuelven los nodos de texto. Para obtener más información sobre el tipo de nodo principal y su relación con la prueba de nodo, vea El tema Especificar prueba de nodo en un paso de expresión de ruta de acceso .
Los nodos <c
> de elemento y <d
> se devuelven, como se muestra en el resultado siguiente:
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Si especifica un eje descendiente o auto en lugar del eje descendiente, /child::a/child::b/descendant-or-self::*
devuelve el nodo de contexto, el elemento <b
>y su descendiente.
El resultado es el siguiente:
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
<c>text2
<d>text3</d>
</c>
<d>text3</d>
La siguiente consulta de ejemplo en la base de datos AdventureWorks recupera todos los nodos de elemento descendiente del <Features
> elemento secundario del <ProductDescription
> elemento :
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/child::PD:ProductDescription/child::PD:Features/descendant::*
')
FROM Production.ProductModel
WHERE ProductModelID=19
C. Especificar un eje parent
La consulta siguiente devuelve el <Summary
> elemento secundario del><ProductDescription
elemento del documento XML del catálogo de productos almacenado en la Production.ProductModel
tabla.
En este ejemplo se usa el eje primario para volver al elemento primario del <Feature
> elemento y recuperar el <Summary
> elemento secundario del <ProductDescription
> elemento .
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/child::PD:ProductDescription/child::PD:Features/parent::PD:ProductDescription/child::PD:Summary
')
FROM Production.ProductModel
WHERE ProductModelID=19
En este ejemplo de consulta, la expresión de ruta de acceso utiliza el eje parent
. Puede volver a escribir la expresión sin el eje parent, tal como se muestra a continuación:
/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary
A continuación se ofrece un ejemplo más útil del eje parent.
Cada descripción del catálogo de modelos de producto almacenada en la columna CatalogDescription de la tabla ProductModel tiene un <ProductDescription>
elemento que tiene el atributo y <Features>
el ProductModelID
elemento secundario, como se muestra en el fragmento siguiente:
<ProductDescription ProductModelID="..." >
...
<Features>
<Feature1>...</Feature1>
<Feature2>...</Feature2>
...
</ProductDescription>
La consulta establece una variable de iteración, $f
, en la instrucción FLWOR para devolver el elemento secundario del elemento <Features>
. Para obtener más información, vea FlWOR Statement and Iteration (XQuery). Por cada característica, la cláusula return
construye un XML de la forma siguiente:
<Feature ProductModelID="...">...</Feature>
<Feature ProductModelID="...">...</Feature>
Para agregar el ProductModelID
elemento para cada <Feature
> elemento, se especifica el parent
eje:
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
for $f in /child::PD:ProductDescription/child::PD:Features/child::*
return
<Feature
ProductModelID="{ ($f/parent::PD:Features/parent::PD:ProductDescription/attribute::ProductModelID)[1]}" >
{ $f }
</Feature>
')
FROM Production.ProductModel
WHERE ProductModelID=19
Éste es el resultado parcial:
<Feature ProductModelID="19">
<wm:Warranty
xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>
<wm:Description>parts and labor</wm:Description>
</wm:Warranty>
</Feature>
<Feature ProductModelID="19">
<wm:Maintenance
xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<wm:NoOfYears>10 years</wm:NoOfYears>
<wm:Description>maintenance contract available through your dealer
or any AdventureWorks retail store.</wm:Description>
</wm:Maintenance>
</Feature>
<Feature ProductModelID="19">
<p1:wheel
xmlns:p1="https://www.adventure-works.com/schemas/OtherFeatures">
High performance wheels.
</p1:wheel>
</Feature>
Tenga en cuenta que se agrega el predicado [1]
en la expresión de ruta de acceso para garantizar que se devuelve un valor singleton.