Partilhar via


Expressões de Caminho – Especificar Eixo

Aplica-se: 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:

Eixo 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.
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 para frente. O eixo pai é um eixo reverso, 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ó do 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 em relação aos 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 relação a colunas de tipo xml no banco de dados AdventureWorks.

R. 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 Production.ProductModel na 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:

  • O query() método 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 o teste de nó 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 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 próprio 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 consulta de exemplo a seguir no banco de dados AdventureWorks recupera todos os nós de elemento descendentes doFeatures<> 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 elemento no documento XML do> <ProductDescriptioncatálogo de produtos armazenado na Production.ProductModel tabela.

Este exemplo usa o eixo pai para retornar ao pai do <>Featureelemento e recuperar oSummary> <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/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 de catálogo de modelo 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 e iteraçã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 <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.