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