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() を使用できるのは、コンテキスト依存の述語のコンテキストにおいてのみです。具体的には、角かっこ ([ ]) 内でしか使用できません。

このトピックでは、AdventureWorks データベースのさまざまな xml 型列に格納されている XML インスタンスに対して実行する XQuery の例について説明します。これらの各列の概要については、「AdventureWorks データベースの 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 yearsparts 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