Freigeben über


Funktionen, die sich auf QNames beziehen – expanded-QName

Gilt für: SQL Server

Gibt einen Wert des Typs "xs:QName" mit dem namespace-URI zurück, der in der $paramURI und dem im $paramLocal angegebenen lokalen Namen angegeben ist. 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.

Hinweise

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

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

  • Die Konvertierung von xs:QName-Typ in einen anderen Typ wird in SQL Server nicht unterstützt. Aus diesem Fall kann die Expanded-QName() -Funktion 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 z. B/root[1]/e[1] eq expanded-QName("http://nsURI" "myNS"). den Wert des Elements mit dem QName, <>eder von der Expanded-QName()-Funktion 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 eine Tabelle mit einer XML-Typspalte mithilfe der XML-Schemaauflistung.

  • Speichern einer XML-Instanz in der Tabelle.

  • Verwendet die Modify()- Methode des XML-Datentyps, um den Wert des QName-Typelements in der Instanz zu ändern. Die Expanded-QName() -Funktion 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 instance  
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 dargestellt.

-- 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> des QName-Typs 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 Expanded-QName-Funktion 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 Instanz mit einem Wert für das <root> Element einzufügen und dann zu ändern. In diesem Beispiel wird ein Null-Anfangswert verwendet, wenn das <root> Element eingefügt wird. Die XML-Schemaauflistung in diesem Beispiel ermöglicht einen Nilwert für das <root> Element.

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 dem QName-Typwert entsprechen, der von der Expanded-QName() -Funktion 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 Expanded-QName() -Funktion 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 im Zusammenhang mit QNames (XQuery)