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.