Funciones relacionadas con QNames: expanded-QName

Se aplica a:SQL Server

Devuelve un valor del tipo xs:QName con el URI de espacio de nombres especificado en el $paramURI y el nombre local especificado en el $paramLocal. Si $paramURI es la cadena vacía o la secuencia vacía, no representa ningún espacio de nombres.

Sintaxis

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

Argumentos

$paramURI
Es el URI del espacio de nombres de QName.

$paramLocal
Es la parte local del nombre de QName.

Comentarios

Lo siguiente se aplica a la función expanded-QName():

  • Si el valor de $paramLocal especificado no está en el formato léxico correcto para el tipo xs:NCName, se devuelve la secuencia vacía y representa un error dinámico.

  • La conversión del tipo xs:QName a cualquier otro tipo no se admite en SQL Server. Por este motivo, la función expanded-QName() no se puede usar en la construcción XML. Por ejemplo, cuando se construye un nodo, como <e> expanded-QName(...) </e>, el valor no puede tener un tipo. Esto requeriría la conversión del valor de tipo xs:QName devuelto por expanded-QName() en xdt:untypedAtomic. Sin embargo, esta opción no se admite. Más adelante en este tema se ofrece un ejemplo.

  • Es posible modificar o comparar los valores de tipo QName existentes. Por ejemplo, /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") compara el valor del elemento ,><e con el QName devuelto por la función expanded-QName().

Ejemplos

En este tema se proporcionan ejemplos de XQuery en instancias XML que se almacenan en varias columnas de tipo xml de la AdventureWorks2022 base de datos.

A. Reemplazar un valor de nodo del tipo QName

En este ejemplo se ilustra cómo se puede modificar el valor de un nodo de elemento del tipo QName. En el ejemplo, se realizan las tareas siguientes:

  • Se crea una colección de esquemas XML que define un elemento del tipo QName.

  • Crea una tabla con una columna de tipo xml mediante la colección de esquemas XML.

  • Se guarda una instancia XML en la tabla.

  • Usa el método modify() del tipo de datos xml para modificar el valor del elemento de tipo QName en la instancia. La función expanded-QName() se usa para generar el nuevo valor de 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>   

En la consulta siguiente, el valor del <ElemQN> elemento se reemplaza mediante el método modify() del tipo de datos xml y el valor replace de XML DML, como se muestra.

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

Éste es el resultado. Tenga en cuenta que el elemento <ElemQN> del tipo QName ahora tiene un nuevo valor:

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

Las instrucciones siguientes eliminan los objetos utilizados en el ejemplo.

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

B. Superar las limitaciones cuando se utiliza la función expanded-QName()

La función expanded-QName no se puede usar en la construcción XML. Esto se ilustra en el siguiente ejemplo: Para evitar esta limitación, el ejemplo inserta primero un nodo y, a continuación, modifica el nodo.

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

El siguiente intento agrega otro <root> elemento pero se produce un error, porque la función expanded-QName() no se admite en la construcción XML.

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

Una solución a esto consiste en insertar primero una instancia con un valor para el <root> elemento y, a continuación, modificarla. En este ejemplo, se usa un valor inicial nulo cuando se inserta el <root> elemento. La colección de esquemas XML de este ejemplo permite un valor nulo para el <root> elemento .

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>

Se puede comparar el valor QName, tal y como se muestra en la consulta siguiente. La consulta devuelve solo los <root> elementos cuyos valores coinciden con el valor de tipo QName devuelto por la función expanded-QName().

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

Limitaciones de la implementación

Hay una limitación: la función expanded-QName() acepta la secuencia vacía como segundo argumento y devolverá vacía en lugar de generar un error en tiempo de ejecución cuando el segundo argumento sea incorrecto.

Consulte también

Funciones relacionadas con QNames (XQuery)