expanded-QName (XQuery)

Renvoie une valeur du type xs:QName avec l'URI d'espace de noms spécifié dans l'argument $paramURI et le nom local spécifié dans l'argument $paramLocal. Si l'argument $paramURI est la chaîne vide ou la séquence vide, il ne représente aucun espace de noms.

Syntaxe

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

Arguments

  • $paramURI
    URI d'espace de noms du QName.

  • $paramLocal
    Partie du nom local du QName.

Remarques

Les conditions suivantes s'appliquent à la fonction expanded-QName() :

  • Si la valeur $paramLocal spécifiée n'est pas exprimée dans la forme lexicale correcte du type xs:NCName, la séquence vide est renvoyée et représente une erreur dynamique.

  • SQL Server ne prend en charge la conversion du type xs:QName vers aucun autre type. Par conséquent, la fonction expanded-QName() ne peut pas être utilisée dans une construction XML. Par exemple, lorsque vous construisez un nœud, tel que <e> expanded-QName(…) </e>, la valeur doit être non typée. Cela suppose que vous convertissiez la valeur de type xs:QName renvoyée par expanded-QName() en xdt:untypedAtomic. Toutefois, cette opération n'est pas prise en charge. Une solution est proposée dans un exemple, plus loin dans cette rubrique.

  • Vous pouvez modifier ou comparer les valeurs de type QName existantes. Par exemple, /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") compare la valeur de l'élément <e> au QName renvoyé par la fonction expanded-QName().

Exemples

Cette rubrique fournit des exemples de requêtes XQuery impliquant des instances XML stockées dans différentes colonnes de type xml dans la base de données AdventureWorks2008R2. Pour obtenir une vue d'ensemble de chacune de ces colonnes, consultez Représentation du type de données xml dans la base de données AdventureWorks2008R2.

A. Remplacement d'une valeur de nœud de type QName

Cet exemple montre comment vous pouvez modifier la valeur d'un nœud d'élément de type QName. L'exemple effectue les opérations suivantes :

  • Crée une collection de schémas XML qui définit un élément de type QName.

  • Crée une table dotée d'une colonne de type xml à l'aide de la collection de schémas XML.

  • Enregistre une instance XML dans la table.

  • Utilise la méthode modify() du type de données xml pour modifier la valeur de l'élément de type QName dans l'instance. La fonction expanded-QName() permet de générer la nouvelle valeur de type 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="http://myURI">
      <ElemQN>ns:someName</ElemQN>
</Root>')
go
-- Verify the insertion
SELECT * from T
go
-- Result
<Root xmlns="QNameXSD" xmlns:ns="http://myURI">
  <ElemQN>ns:someName</ElemQN>
</Root> 

Dans la requête suivante, la valeur de d'élément <ElemQN> est remplacée à l'aide de la méthode modify() du type de données xml et de la fonction DML XML « replace value of ».

-- the value.
UPDATE T 
SET XmlCol.modify('
  declare default element namespace "QNameXSD"; 
  replace value of /Root[1]/ElemQN 
  with expanded-QName("http://myURI", "myLocalName") ')
go
-- Verify the result
SELECT * from T
go

Voici le résultat obtenu : l'élément <ElemQN> de type QName possède désormais une nouvelle valeur :

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

Les instructions suivantes suppriment les objets utilisés dans l'exemple.

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

B. Gestion des limites liées à l'utilisation de la fonction expanded-QName()

La fonction expanded-QName ne peut pas être utilisée dans une construction XML. L'exemple suivant illustre ce comportement. Pour contourner cette limite, l'exemple insère d'abord un nœud, puis le modifie.

-- 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="http://someURI">a:b</root>')
 go
-- Verify
SELECT * 
FROM T

La tentative suivante d'ajout d'un autre élément <root> se solde par un échec car la fonction n'est pas prise en charge dans la construction XML.

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

Une solution à ce problème consiste à insérer une instance avec une valeur pour l'élément <root> puis à la modifier. Dans cet exemple, une valeur initiale nil est utilisée lorsque l'élément <root> est inséré. La collection de schémas XML utilisée dans cet exemple autorise une valeur nil pour l'élément <root>.

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="http://someURI">a:b</root>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="http://ns">p1:someLocalName</root>

Vous pouvez comparer la valeur QName, comme le montre la requête ci-après. Celle-ci renvoie uniquement les éléments <root> dont la valeur correspond à la valeur de type QName renvoyée par la fonction expanded-QName().

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

Limites de la mise en œuvre

Il existe une limite : la fonction expanded-QName() accepte la séquence vide comme second argument et retourne un résultat vide au lieu de déclencher une erreur d'exécution lorsque le second argument est incorrect.