Manipulação de namespaces no XQuery

Aplica-se a: SQL Server

Este tópico fornece exemplos para lidar com namespaces em consultas.

Examples

A. Declaração de um namespace

A consulta seguinte recupera as etapas de fabrico de um modelo de produto específico.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        /AWMI:root/AWMI:Location[1]/AWMI:step  
    ') as x  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Este é o resultado parcial:

<AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <AWMI:material>aluminum sheet MS-2341</AWMI:material> into the <AWMI:tool>T-85A framing tool</AWMI:tool>. </AWMI:step>  
...  

Note que a palavra-chave do espaço de nomes é usada para definir um novo prefixo de espaço de nomes, "AWMI:". Este prefixo deve então ser usado na consulta para todos os elementos que se enquadram no âmbito desse espaço de nomes.

B. Declaração de um espaço de nomes por defeito

Na consulta anterior, foi definido um novo prefixo de namespace. Esse prefixo teve então de ser usado na consulta para selecionar as estruturas XML pretendidas. Em alternativa, pode declarar um namespace como o namespace padrão, como mostrado na seguinte consulta modificada:

SELECT Instructions.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        /root/Location[1]/step  
    ') as x  
FROM Production.ProductModel  
where ProductModelID=7  

Este é o resultado

<step xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <material>aluminum sheet MS-2341</material> into the <tool>T-85A framing tool</tool>. </step>  
...  

Note-se neste exemplo que o namespace definido, "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions", é feito para sobrepor o namespace padrão, ou vazio. Por causa disso, já não tem um prefixo de namespace na expressão de caminho usado para a consulta. Também já não tem um prefixo de namespace nos nomes dos elementos que aparecem nos resultados. Além disso, o namespace padrão é aplicado a todos os elementos, mas não aos seus atributos.

C. Utilização de namespaces na construção XML

Quando defines novos namespaces, eles são trazidos para o âmbito não só para a consulta, mas também para a construção. Por exemplo, na construção de XML, pode definir um novo namespace usando a declaração "declare namespace ..." e depois usar esse namespace com quaisquer elementos e atributos que constrói para aparecerem nos resultados da consulta.

SELECT CatalogDescription.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     declare namespace myNS="uri:SomeNamespace";<myNS:Result>  
          { /ProductDescription/Summary }  
       </myNS:Result>  
  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

Este é o resultado:

  
      <myNS:Result xmlns:myNS="uri:SomeNamespace">  
  <Summary xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
   <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">  
     Our top-of-the-line competition mountain bike. Performance-enhancing   
     options include the innovative HL Frame, super-smooth front   
     suspension, and traction for all terrain.</p1:p>  
  </Summary>  
</myNS:Result>  

Em alternativa, pode também definir explicitamente o namespace em cada ponto onde é usado como parte da construção XML, como mostrado na consulta seguinte:

SELECT CatalogDescription.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <myNS:Result xmlns:myNS="uri:SomeNamespace">  
          { /ProductDescription/Summary }  
       </myNS:Result>  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

D. Construção usando namespaces por defeito

Também pode definir um namespace por defeito para uso em XML construído. Por exemplo, a consulta seguinte mostra como pode especificar um namespace por defeito, "uri:SomeNamespace"\, para usar como padrão para os elementos localmente nomeados que são construídos, como o <Result> elemento.

SELECT CatalogDescription.query('  
      declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
      declare default element namespace "uri:SomeNamespace";<Result>  
          { /PD:ProductDescription/PD:Summary }  
       </Result>  
  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

Este é o resultado:

  
      <Result xmlns="uri:SomeNamespace">  
  <PD:Summary xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
   <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">  
         Our top-of-the-line competition mountain bike. Performance-  
         enhancing options include the innovative HL Frame, super-smooth   
         front suspension, and traction for all terrain.</p1:p>  
  </PD:Summary>  
</Result>  

Note-se que, ao sobrepor o namespace de elementos por defeito ou o namespace vazio, todos os elementos localmente nomeados no XML construído ficam subsequentemente ligados ao namespace predefinido dominante. Portanto, se precisar de flexibilidade na construção de XML para tirar partido do espaço de nomes vazio, não sobrepor o espaço de nomes dos elementos por defeito.