Partilhar via


Especificando eixo em uma etapa de expressão de caminho

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 XQuery no SQL Server oferece suporte às seguintes etapas de eixo:

Axis

Descrição

filho

Retorna os filhos do nó de contexto.

descendente

Retorna todos os descendentes do nó de contexto.

pai

Retorna o pai do nó de contexto.

atributo

Retorna os atributos do nó de contexto.

auto

Retorna o próprio nó de contexto.

descendant-or-self

Retorna o nó de contexto e todos os descendentes do nó de contexto.

Todos esses eixos, exceto o eixo pai, são eixos encaminhados. O eixo pai é um eixo inverso, pois ele pesquisa para trás na hierarquia do documento. 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ó de 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 executado contra os documentos XML de instruções de fabricação na tabela Production.ProductModel, a expressão retornará o atributo LocationID do filho do nó de elemento <Location> do elemento <root>.

Exemplos

Os exemplos de consulta neste tópico são especificados contra as colunas do 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ó do elemento <Features> do nó do elemento <ProductDescription> da descrição do catálogo de produtos armazenada na tabela Production.ProductModel.

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:

  • O método query() do tipo de dados xml especifica a expressão de caminho.

  • Ambas as etapas na expressão de caminho especificam um eixo child e os nomes de nó, ProductDescription e Features. Para obter informações sobre testes de nó, consulte Especificando node test em uma etapa de expressão de caminho.

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 contra uma variável do 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::*, estará solicitando todos os descendentes do nó do elemento <b>.

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 node test em uma etapa de expressão de caminho.

Os nós do elemento <c> e <d> são retornados, como mostrado no resultado a seguir:

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

Se você especificar um eixo descendente ou self em vez do eixo descendente, /child::a/child::b/descendant-or-self::* retorna 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 consulta de exemplo a seguir contra o banco de dados AdventureWorks recupera todos os nós do elemento descendentes do filho do elemento <Features> do elemento <ProductDescription>:

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 filho do elemento <Summary> do elemento <ProductDescription> no documento XML do catálogo de produtos armazenado na tabela Production.ProductModel.

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

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 modelo do produto armazenado na coluna CatalogDescription da tabela ProductModel tem um elemento <ProductDescription> que tem o atributo ProductModelID e o elemento filho <Features>, como 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 Iteração e instrução FLWOR (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 elemento <Feature>, é especificado o eixo parent:

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.