Zpracování jmenných prostorů v XQuery

platí pro:SQL Server

Toto téma poskytuje ukázky pro zpracování jmenných prostorů v dotazech.

Examples

A. Deklarace jmenného prostoru

Následující dotaz získává výrobní kroky konkrétního produktového modelu.

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  

Toto je částečný výsledek:

<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>  
...  

Všimněte si, že klíčové slovo ve jmenném prostoru se používá k definování nového prefixu jmenného prostoru "AWMI:". Tento prefix pak musí být použit v dotazu pro všechny prvky, které spadají do rozsahu daného jmenného prostoru.

B. Deklarace výchozího jmenného prostoru

V předchozím dotazu byla definována nová předpona jmenného prostoru. Tento prefix musel být pak použit v dotazu k výběru zamýšlených XML struktur. Alternativně můžete deklarovat jmenný prostor jako výchozí jmenný prostor, jak ukazuje následující upravený dotaz:

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  

Toto je výsledek.

<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>  
...  

V tomto příkladu je definován jmenný prostor , který je nastaven tak, "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"aby přepsal výchozí, tedy prázdný, jmenný prostor. Kvůli tomu už v cestě nemáte prefix jmenného prostoru, který se používá k dotazování. Také už nemáte prefixy jmenného prostoru v názvech prvků, které se objevují ve výsledcích. Navíc je výchozí jmenný prostor aplikován na všechny prvky, ale ne na jejich atributy.

C. Použití jmenných prostorů při XML konstrukci

Když definujete nové jmenné prostory, jsou zahrnuty nejen pro dotaz, ale i pro samotnou konstrukci. Například při tvorbě XML můžete definovat nový jmenný prostor pomocí deklarace "declare namespace ..." a poté tento jmenný prostor použít s jakýmikoli prvky a atributy, které zkonstruujete, aby se objevily ve výsledcích dotazu.

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  

Toto je výsledek:

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

Alternativně můžete jmenný prostor explicitně definovat v každém bodě, kde je použit jako součást XML konstrukce, jak je ukázáno v následujícím dotazu:

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. Konstrukce pomocí výchozích jmenných prostorů

Můžete také definovat výchozí jmenný prostor pro použití ve konstruovaném XML. Například následující dotaz ukazuje, jak můžete nastavit výchozí jmenný prostor "uri:SomeNamespace"\, který použijete jako výchozí pro lokálně pojmenované prvky, které jsou konstruovány, například daný <Result> prvek.

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  

Toto je výsledek:

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

Všimněte si, že přepsáním výchozího jmenného prostoru prvků nebo prázdného jmenného prostoru jsou všechny lokálně pojmenované prvky v vytvořeném XML následně vázány na přepisující výchozí jmenný prostor. Pokud tedy potřebujete flexibilitu při konstrukci XML pro využití prázdného jmenného prostoru, nepřepisujte výchozí jmenný prostor prvků.