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.