Funzioni correlate a elementi QName - expanded-QName

Si applica a:SQL Server

Restituisce un valore del tipo xs:QName con l'URI dello spazio dei nomi specificato nel $paramURI e il nome locale specificato nella $paramLocal. Se $paramURI è la stringa vuota o la sequenza vuota, non rappresenta alcuno spazio dei nomi.

Sintassi

fn:expanded-QName($paramURI as xs:string?, $paramLocal as xs:string?) as xs:QName?  

Argomenti

$paramURI
URI dello spazio dei nomi dell'elemento QName.

$paramLocal
Parte dell'elemento QName che rappresenta il nome locale.

Osservazioni:

Il codice seguente si applica alla funzione expanded-QName():

  • Se il valore $paramLocal specificato non è nel formato lessicale corretto per il tipo xs:NCName, la sequenza vuota viene restituita e rappresenta un errore dinamico.

  • La conversione dal tipo xs:QName a qualsiasi altro tipo non è supportata in SQL Server. Per questo motivo, la funzione expanded-QName() non può essere utilizzata nella costruzione XML. Ad esempio, quando si costruisce un nodo come <e> expanded-QName(...) </e>, il valore deve essere non tipizzato. A questo scopo è necessario convertire il valore del tipo xs:QName restituito da expanded-QName() in xdt:untypedAtomic. La funzionalità non è tuttavia supportata. Una soluzione a questo problema è illustrata in un esempio di seguito in questo argomento.

  • È possibile modificare o confrontare i valori di tipo QName esistenti. Ad esempio, /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") confronta il valore dell'elemento , <>econ il QName restituito dalla funzione expanded-QName().

Esempi

In questo argomento vengono forniti esempi di XQuery su istanze XML archiviate in varie colonne di tipo xml nel AdventureWorks2022 database.

R. Sostituzione di un valore di nodo di tipo QName

Nell'esempio seguente viene illustrata la procedura per modificare il valore di un nodo elemento di tipo QName. Nell'esempio vengono eseguite le operazioni seguenti:

  • Crea una raccolta di XML Schema che definisce un elemento di tipo QName.

  • Crea una tabella con una colonna di tipo xml utilizzando la raccolta di XML Schema.

  • Salva un'istanza XML nella tabella.

  • Usa il metodo modify() del tipo di dati xml per modificare il valore dell'elemento di tipo QName nell'istanza di . La funzione expanded-QName() viene usata per generare il nuovo valore del tipo QName.

-- If XML schema collection (if exists)  
-- drop xml schema collection SC  
-- go  
-- Create XML schema collection  
CREATE XML SCHEMA COLLECTION SC AS N'  
<schema xmlns="http://www.w3.org/2001/XMLSchema"  
    xmlns:xs="http://www.w3.org/2001/XMLSchema"   
    targetNamespace="QNameXSD"   
      xmlns:xqo="QNameXSD" elementFormDefault="qualified">  
      <element name="Root" type="xqo:rootType" />  
      <complexType name="rootType">  
            <sequence minOccurs="1" maxOccurs="1">  
                        <element name="ElemQN" type="xs:QName" />  
            </sequence>  
      </complexType>  
</schema>'  
go  
-- Create table.  
CREATE TABLE T( XmlCol xml(SC) )  
-- Insert sample XML instnace  
INSERT INTO T VALUES ('  
<Root xmlns="QNameXSD" xmlns:ns="https://myURI">  
      <ElemQN>ns:someName</ElemQN>  
</Root>')  
go  
-- Verify the insertion  
SELECT * from T  
go  
-- Result  
<Root xmlns="QNameXSD" xmlns:ns="https://myURI">  
  <ElemQN>ns:someName</ElemQN>  
</Root>   

Nella query seguente il valore dell'elemento viene sostituito usando il metodo modify() del tipo di dati xml e il valore di sostituzione di XML DML, come illustrato.<ElemQN>

-- the value.  
UPDATE T   
SET XmlCol.modify('  
  declare default element namespace "QNameXSD";   
  replace value of /Root[1]/ElemQN   
  with expanded-QName("https://myURI", "myLocalName") ')  
go  
-- Verify the result  
SELECT * from T  
go  

Di seguito è riportato il risultato. Si noti che l'elemento <ElemQN> del tipo QName ha ora un nuovo valore:

<Root xmlns="QNameXSD" xmlns:ns="urn">  
  <ElemQN xmlns:p1="https://myURI">p1:myLocalName</ElemQN>  
</Root>  

Le istruzioni seguenti rimuovono gli oggetti utilizzati nell'esempio.

-- Cleanup  
DROP TABLE T  
go  
drop xml schema collection SC  
go  

B. Gestione delle limitazioni di utilizzo della funzione expanded-QName()

Impossibile utilizzare la funzione expanded-QName nella costruzione XML. Ciò è illustrato nell'esempio seguente. Per ovviare a questa limitazione, nell'esempio viene inserito per prima cosa un nodo, che verrà poi modificato.

-- if exists drop the table T  
--drop table T  
-- go  
-- Create XML schema collection  
-- DROP XML SCHEMA COLLECTION SC  
-- go  
CREATE XML SCHEMA COLLECTION SC AS '  
<schema xmlns="http://www.w3.org/2001/XMLSchema">  
      <element name="root" type="QName" nillable="true"/>  
</schema>'  
go  
 -- Create table T with a typed xml column (using the XML schema collection)  
CREATE TABLE T (xmlCol XML(SC))  
go  
-- Insert an XML instance.  
insert into T values ('<root xmlns:a="https://someURI">a:b</root>')  
 go  
-- Verify  
SELECT *   
FROM T  

Il tentativo seguente aggiunge un altro <root> elemento ma non riesce perché la funzione expanded-QName() non è supportata nella costruzione XML.

update T SET xmlCol.modify('  
insert <root>{expanded-QName("http://ns","someLocalName")}</root> as last into / ')  
go  

Una soluzione consiste nell'inserire prima un'istanza con un valore per l'elemento <root> e quindi modificarla. In questo esempio viene utilizzato un valore iniziale nil quando viene inserito l'elemento <root> . La raccolta di XML Schema in questo esempio consente un valore nil per l'elemento <root> .

update T SET xmlCol.modify('  
insert <root xsi:nil="true"/> as last into / ')  
go  
-- now replace the nil value with another QName.  
update T SET xmlCol.modify('  
replace value of /root[last()] with expanded-QName("http://ns","someLocalName") ')  
go  
 -- verify   
SELECT * FROM T  
go  
-- result  
<root>b</root>  

<root xmlns:a="https://someURI">a:b</root>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="http://ns">p1:someLocalName</root>

È possibile confrontare il valore dell'elemento QName, come illustrato nella query seguente. La query restituisce solo gli elementi i <root> cui valori corrispondono al valore del tipo QName restituito dalla funzione expanded-QName().

SELECT xmlCol.query('  
    for $i in /root  
    return  
       if ($i eq expanded-QName("http://ns","someLocalName") ) then  
          $i  
       else  
          ()')  
FROM T  

Limitazioni di implementazione

Esiste una limitazione: la funzione expanded-QName() accetta la sequenza vuota come secondo argomento e restituirà vuoto anziché generare un errore di run-time quando il secondo argomento non è corretto.

Vedi anche

Funzioni correlate a QNames (XQuery)