Partilhar via


Funções Relacionadas a QNames – expanded-QName

Aplica-se: SQL Server

Retorna um valor do tipo xs:QName com o URI do namespace especificado no $paramURI e o nome local especificado no $paramLocal. Se $paramURI for a cadeia de caracteres vazia ou a sequência vazia, ele não representará nenhum namespace.

Sintaxe

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

Argumentos

$paramURI
É o namespace URI para o QName.

$paramLocal
É a parte do nome local do QName.

Comentários

O seguinte se aplica à função expanded-QName():

  • Se o valor $paramLocal especificado não estiver na forma lexical correta para o tipo xs:NCName, a sequência vazia será retornada e representará um erro dinâmico.

  • Não há suporte para a conversão do tipo xs:QName para qualquer outro tipo no SQL Server. Por isso, a função expanded-QName() não pode ser usada na construção de XML. Por exemplo, quando você estiver construindo um nó, como <e> expanded-QName(...) </e>, o valor precisa ser não digitado. Isso exigiria que você convertesse o valor de tipo xs:QName retornado por expanded-QName() para xdt:untypedAtomic. Porém, não é oferecido suporte para isso. Em um exemplo posterior neste tópico é oferecida uma solução.

  • Você pode modificar ou comparar os valores de tipo QName existentes. Por exemplo, /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") compara o valor do elemento, <e>, com o QName retornado pela função expanded-QName().

Exemplos

Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas de tipo xml no AdventureWorks2022 banco de dados.

R. Substituindo um valor de nó do tipo QName

Este exemplo ilustra como você pode modificar o valor de um nó de elemento do tipo QName. O exemplo executa o seguinte:

  • Cria uma coleção de esquemas XML que define um elemento do tipo QName.

  • Cria uma tabela com uma coluna do tipo xml usando a coleção de esquemas XML.

  • Salva uma instância XML na tabela.

  • Usa o método modify() do tipo de dados xml para modificar o valor do elemento de tipo QName na instância. A função expanded-QName() é usada para gerar o novo valor do 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 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>   

Na consulta a seguir, o valor do <ElemQN> elemento é substituído usando o método modify() do tipo de dados xml e o valor replace de XML DML, conforme mostrado.

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

Este é o resultado. Observe que o elemento <ElemQN> do tipo QName agora tem um novo valor:

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

As instruções a seguir removem os objetos usados no exemplo.

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

B. Tratando as limitações ao usar a função expanded-QName()

A função expanded-QName não pode ser usada na construção XML. O exemplo a seguir ilustra essa situação. Para solucionar essa limitação, o exemplo primeiro insere um nó e, em seguida, modifica o nó.

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

A tentativa a seguir adiciona outro <root> elemento, mas falha, porque a função expanded-QName() não é suportada na construção XML.

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

Uma solução para isso é primeiro inserir uma instância com um valor para o <root> elemento e, em seguida, modificá-la. Neste exemplo, um valor inicial nil é usado quando o <root> elemento é inserido. A coleção de esquemas XML neste exemplo permite um valor nil para o <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>

Você pode comparar o valor QName, como mostrado na consulta a seguir. A consulta retorna apenas os <root> elementos cujos valores correspondem ao valor do tipo QName retornado pela função expanded-QName().

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

Limitações de implementação

Há uma limitação: a função expanded-QName() aceita a sequência vazia como o segundo argumento e retornará vazia em vez de gerar um erro de tempo de execução quando o segundo argumento estiver incorreto.

Confira também

Funções relacionadas a QNames (XQuery)