Compartir a través de


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 y Features, 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><ProductDescriptionelemento 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.