Funktionen, die sich auf QNames beziehen – expanded-QName

Gilt für:SQL Server

Gibt einen Wert des xs:QName-Typs mit dem im $paramURI angegebenen Namespace-URI und dem im $paramLocal angegebenen lokalen Namen zurück. Wenn $paramURI die leere Zeichenfolge oder die leere Sequenz ist, stellt sie keinen Namespace dar.

Syntax

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

Argumente

$paramURI
Der Namespace-URI (Universal Resource Identifier) für QName.

$paramLocal
Der lokale Teil des Namens von QName.

Bemerkungen

Für die Funktion expanded-QName() gilt Folgendes:

  • Wenn der angegebene $paramLocal Wert nicht in der richtigen lexikalischen Form für den xs:NCName-Typ vorliegt, wird die leere Sequenz zurückgegeben und stellt einen dynamischen Fehler dar.

  • Die Konvertierung vom xs:QName-Typ in einen anderen Typ wird in SQL Server nicht unterstützt. Aus diesem Fall kann die funktion expanded-QName() nicht in der XML-Konstruktion verwendet werden. Wenn Sie beispielsweise einen Knoten wie <e> expanded-QName(...) </e> konstruieren, darf der Wert nicht typisiert sein. Um dies zu erreichen, müssten Sie den von expanded-QName() zurückgegebenen Wert vom Typ xs:QName in xdt:untypedAtomic konvertieren. Dies wird jedoch nicht unterstützt. Eine Lösungsmöglichkeit wird nachfolgend in diesem Thema bereitgestellt.

  • Sie können vorhandene Werte vom Typ QName ändern oder vergleichen. Vergleicht beispielsweise /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") den Wert des Elements mit dem QName,><e der von der funktion expanded-QName() zurückgegeben wird.

Beispiele

Dieses Thema enthält XQuery-Beispiele für XML-Instanzen, die in verschiedenen Xml-Typspalten in der AdventureWorks2022 Datenbank gespeichert sind.

A. Ersetzen eines Knotenwerts vom Typ QName

In diesem Beispiel wird veranschaulicht, wie Sie den Wert eines Elementknotens vom Typ QName ändern können. Das Beispiel führt die folgenden Aktionen aus:

  • Erstellen einer XML-Schemaauflistung, die ein Element vom Typ QName definiert.

  • Erstellt mithilfe der XML-Schemaauflistung eine Tabelle mit einer Xml-Typspalte .

  • Speichern einer XML-Instanz in der Tabelle.

  • Verwendet die modify()-Methode des xml-Datentyps, um den Wert des QName-Typelements im instance zu ändern. Die funktion expanded-QName() wird verwendet, um den neuen QName-Typwert zu generieren.

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

In der folgenden Abfrage wird der <ElemQN> Elementwert durch die modify() -Methode des xml-Datentyps und den Ersetzungswert von XML DML ersetzt, wie gezeigt.

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

Dies ist das Ergebnis. Beachten Sie, dass das Element <ElemQN> vom Typ QName jetzt über einen neuen Wert verfügt:

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

Die folgenden Anweisungen entfernen die in diesem Beispiel verwendeten Objekte.

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

B. Umgehend mit den Einschränkungen bei Verwendung der erweiterten QName()-Funktion

Die funktion expanded-QName kann nicht in der XML-Konstruktion verwendet werden. Dies wird anhand des folgenden Beispiels veranschaulicht. Im Beispiel wird zuerst ein Knoten eingefügt, um diese Einschränkung zu umgehen, und dann wird der Knoten geändert.

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

Der folgende Versuch fügt ein weiteres <root> Element hinzu, schlägt jedoch fehl, da die funktion expanded-QName() in der XML-Konstruktion nicht unterstützt wird.

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

Eine Lösung hierfür besteht darin, zuerst eine instance mit einem Wert für das <root> Element einzufügen und ihn dann zu ändern. In diesem Beispiel wird ein Null-Anfangswert verwendet, wenn das <root> Element eingefügt wird. Die XML-Schemaauflistung in diesem Beispiel lässt einen Nullwert für das <root> -Element zu.

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>

Sie können den Wert für QName vergleichen, wie in der folgenden Abfrage gezeigt: Die Abfrage gibt nur die <root> Elemente zurück, deren Werte mit dem QName-Typwert übereinstimmen, der von der funktion expanded-QName() zurückgegeben wird.

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

Implementierungseinschränkungen

Es gibt eine Einschränkung: Die funktion expanded-QName() akzeptiert die leere Sequenz als zweites Argument und gibt leer zurück, anstatt einen Laufzeitfehler zu auslösen, wenn das zweite Argument falsch ist.

Weitere Informationen

Funktionen, die sich auf QNames beziehen (XQuery)