Compartilhar 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:

Eixo

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.

self

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. Para obter mais informações sobre essas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks.

A. Especificação de 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. Especificação de eixos descendente e descendente ou self

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. Especificação de 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 iteradora, $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.