Partilhar via


Funções Relacionadas a QNames – expanded-QName

Aplica-se a: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, ela 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 de $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 conversão do tipo xs:QName em qualquer outro tipo no SQL Server. Devido a isso, a função expanded-QName() não pode ser usada na construção 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 XQuery em instâncias XML armazenadas em várias colunas de tipo xml no AdventureWorks2022 banco de dados.

a. 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 de 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 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>   

Na consulta a seguir, o valor do <ElemQN> elemento é substituído usando o método modify() do tipo de dados xml e o valor de substituição de DML XML, 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 tem suporte 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 modificá-la. Neste exemplo, um valor inicial zero é usado quando o <root> elemento é inserido. A coleção de esquemas XML neste exemplo permite um valor zero 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 de 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 em tempo de execução quando o segundo argumento estiver incorreto.

Consulte Também

Funções relacionadas a QNames (XQuery)