string 関数 (XQuery)
文字列として表現された $arg の値を返します。
構文
fn:string() as xs:string
fn:string($arg as item()?) as xs:string
引数
- $arg
ノードまたはアトミック値です。
説明
$arg が空のシーケンスの場合、長さゼロの文字列が返されます。
$arg がノードの場合、string-value アクセサーを使用して取得したノードの文字列値が返されます。これは、W3C XQuery 1.0 and XPath 2.0 Data Model 仕様で定義されています。
$arg がアトミック値の場合、特に他に指定がなければ、式のキャストによって返される文字列と同じ文字列が xs:string 型で返されます。
$arg の型が xs:anyURI の場合、URI は特殊文字をエスケープせずに文字列に変換されます。
この実装では、引数を指定しないで fn:string() を使用できるのは、コンテキスト依存の述語のコンテキストにおいてのみです。具体的には、角かっこ ([ ]) 内でしか使用できません。
例
このトピックでは、AdventureWorks2008R2 データベースのさまざまな xml 型の列に格納されている XML インスタンスに対して実行する XQuery の例について説明します。これらの各列の概要については、「AdventureWorks2008R2 データベースの xml データ型表現」を参照してください。
A. string 関数の使用
次のクエリは、<ProductDescription> 要素の <Features> 子要素ノードを取得します。
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/PD:ProductDescription/PD:Features
')
FROM Production.ProductModel
WHERE ProductModelID=19
結果の一部を次に示します。
<PD:Features xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
These are the product highlights.
<p1:Warranty xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<p1:WarrantyPeriod>3 years</p1:WarrantyPeriod>
<p1:Description>parts and labor</p1:Description>
</p1:Warranty>
...
</PD:Features>
string() 関数を指定すると、指定したノードの文字列値が取得されます。
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
string(/PD:ProductDescription[1]/PD:Features[1])
')
FROM Production.ProductModel
WHERE ProductModelID=19;
結果の一部を次に示します。
These are the product highlights.
3 years parts and labor...
B. 異なるノードに対する string 関数の使用
次の例では、XML インスタンスが xml 型の変数に割り当てられています。string() をさまざまなノードに適用した結果を示すクエリを指定しています。
declare @x xml;
set @x = '<?xml version="1.0" encoding="UTF-8" ?>
<!-- This is a comment -->
<root>
<a>10</a>
just text
<b attr="x">20</b>
</root>
';
次のクエリは、ドキュメント ノードの文字列値を取得します。この値は、このノードの子孫にあたるすべてのテキスト ノードの文字列値を連結して生成されます。
select @x.query('string(/)');
次に結果を示します。
This is a comment 10
just text
20
次のクエリは、processing-instruction ノードの文字列値を取得します。ただし、このノードにはテキスト ノードが含まれていないため、空のシーケンスが結果として返されます。
select @x.query('string(/processing-instruction()[1])');
次のクエリは、comment ノードの文字列値を取得し、そのテキスト ノードを返します。
select @x.query('string(/comment()[1])');
次に結果を示します。
This is a comment