Expressões de Caminho – Especificar Eixo

Aplica-se a:SQL Server

Uma etapa de eixo em uma expressão de caminho inclui os seguintes componentes:

Para obter mais informações, consulte Expressões de caminho (XQuery).

A implementação do XQuery no SQL Server dá suporte às seguintes etapas de eixo,

Axis Descrição
child Retorna os filhos do nó de contexto.
descendant Retorna todos os descendentes do nó de contexto.
parent Retorna o pai do nó de contexto.
attribute Retorna os atributos do nó de contexto.
Auto Retorna o próprio nó de contexto.
descendente-ou-auto Retorna o nó de contexto e todos os descendentes do nó de contexto.

Todos esses eixos, exceto o eixo pai , são eixos de avanço. O eixo pai é um eixo inverso, pois pesquisa para trás na hierarquia de documentos. Por exemplo, a expressão do caminho relativo child::ProductDescription/child::Summary tem duas etapas, e cada etapa especifica um eixo child. A primeira etapa recupera os filhos do <elemento ProductDescription> do nó de contexto. Para cada <nó de elemento ProductDescription> , a segunda etapa recupera os filhos do nó do <elemento Summary> .

A expressão de caminho relativo, child::root/child::Location/attribute::LocationID, tem três etapas. As primeiras duas etapas especificam um eixo child e a terceira etapa especifica o eixo attribute. Quando executada nos documentos XML de instruções de fabricação na tabela Production.ProductModel , a expressão retorna o LocationID atributo do filho do <nó do elemento Location> do <elemento raiz> .

Exemplos

Os exemplos de consulta neste tópico são especificados em colunas de tipo xml no banco de dados AdventureWorks .

a. Especificando um eixo filho

Para um modelo de produto específico, a consulta a seguir recupera os <filhos do nó de elemento Features> do <nó do elemento ProductDescription> da descrição do catálogo de produtos armazenada na Production.ProductModel tabela.

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 o seguinte na consulta anterior:

B. Especificando eixos descendentes e descendentes ou independentes

O exemplo a seguir usa os eixos descendente e descendente ou self. A consulta neste exemplo é especificada em relação a uma variável de tipo xml . A instância XML é simplificada para ilustrar facilmente a diferença nos resultados gerados.

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  

No resultado a seguir, a expressão retorna o filho do nó do elemento <b> do nó do elemento <a>:

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  

Nesta expressão, se você especificar um eixo descendente para a expressão de caminho,

/child::a/child::b/descendant::*, você está solicitando todos os descendentes do nó do <b> elemento.

O asterisco (*) no teste de nó representa o nome do nó como um teste de nó. Dessa forma, o tipo de nó primário do eixo descendente, o nó do elemento, determina os tipos de nós retornados. Ou seja, a expressão retorna todos os nós do elemento. Não são retornados nós de texto. Para obter mais informações sobre o tipo de nó primário e sua relação com o teste de nó, consulte o tópico Especificando o teste de nó em uma etapa de expressão de caminho .

Os nós <c> de elemento e <d> são retornados, conforme mostrado no seguinte resultado:

<c>text2  
     <d>text3</d>  
</c>  
<d>text3</d>  

Se você especificar um eixo descendente ou auto em vez do eixo descendente, /child::a/child::b/descendant-or-self::* retornará o nó de contexto, o elemento <b>e seu descendente.

Este é o resultado:

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  
  
<c>text2  
     <d>text3</d>  
</c>  
  
<d>text3</d>   

A seguinte consulta de exemplo no banco de dados AdventureWorks recupera todos os nós de elemento descendentes do <Features> filho do <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. Especificando um eixo pai

A consulta a seguir retorna o <Summary> filho do><ProductDescriptionelemento no documento XML do catálogo de produtos armazenado na Production.ProductModel tabela.

Este exemplo usa o eixo pai para retornar ao pai do <Feature> elemento e recuperar o filho do>><Summary<ProductDescriptionelemento.

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  
  

Neste exemplo de consulta, a expressão de caminho usa o eixo parent. Você pode reescrever a expressão sem o eixo pai, como mostrado a seguir:

/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary  

Um exemplo mais útil do eixo pai é fornecido no exemplo a seguir.

Cada descrição do catálogo de modelos de produto armazenada na coluna CatalogDescription da tabela ProductModel tem um <ProductDescription> elemento que tem o atributo e <Features> o ProductModelID elemento filho, conforme mostrado no fragmento a seguir:

<ProductDescription ProductModelID="..." >  
  ...  
  <Features>  
    <Feature1>...</Feature1>  
    <Feature2>...</Feature2>  
   ...  
</ProductDescription>  

A consulta define uma variável iterator, $f, na instrução FLWOR para retornar os filhos do elemento do elemento <Features>. Para obter mais informações, consulte Instrução FLWOR e Iteração (XQuery). Para cada recurso, a cláusula return constrói um XML na seguinte forma:

<Feature ProductModelID="...">...</Feature>  
<Feature ProductModelID="...">...</Feature>  

Para adicionar o ProductModelID para cada <Feature> elemento, o parent eixo é especificado:

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  

Este é o 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>  

Observe que o predicado [1] na expressão de caminho é adicionado para assegurar que um valor de singleton seja retornado.