XML関数この節で説明される関数および擬似関数式は、xml型の値に対して機能します。XML型を点検してください。xml型のやりとりを変換するxmlparseおよびxmlserialize擬似関数式はここでは繰り返しません。--with-libxml付きでビルドされていることが必要です。XML内容の生成SQLデータからXML内容を生成するために関数と擬似関数式の一式が提供されています。そのようなものとして、クライアントアプリケーションが問い合わせ結果を処理のためXML文書に書式化するのにこれらは特に適しています。xmlcommentxmlcomment(text)関数xmlcommentは指定のテキストを内容とするXMLコメントを含んだXML値を作成します。結果として構築されるXMLコメントが有効になるよう、テキストは「--」を含むこと、または「-」で終結することはできません。引数がNULLならば結果もNULLになります。...])関数xmlconcatは、個々のXML値のリストを結合し、XMLの内容断片を含む単一の値を作成します。NULL値は削除され、NULL以外の引数が存在しないときのみ結果はNULLになります。<abc/><bar>foo</bar>XML宣言が提示されている場合は次のように組み合わされます。全ての引数の値が同一のXMLversion宣言を持っていれば、そのversionが結果に使用されます。なければversionは使用されません。全ての引数の値でstandaloneの宣言値が「yes」であれば、その値が結果に使用されます。全ての引数の値にstandalone宣言値があり、その中で1つでも「no」がある場合、それが結果に使用されます。それ以外の場合は、結果はstandalone宣言を持ちません。1.0のversion宣言が使用されます。これはXMLがXML宣言においてversion宣言を含むことを要求するためです。encoding宣言は無視され、全ての場合で削除されます。...])xmlelement式は与えられた名前、属性、および内容を持つXML要素を生成します。bar="2007-01-26">content</foo>有効なXML名ではない要素名と属性名は、シーケンス_xHHHH_により障害となる文字を置換することでエスケープされます。ここで、HHHHは16進数によるその文字のUnicode文字コード番号です。a_x0026_b="xyz"/>属性値が列参照の場合、明示的な属性名を指定する必要はありません。この場合、デフォルトで列名が属性名として使用されます。その他の場合には、属性は明示的な名前で与えられなければなりません。従って、以下の例は有効です。test;しかし、以下の例は有効ではありません。test;もし要素内容が指定されればそのデータ型に従って書式化されます。内容そのものがxml型であれば、複合XML文書が構築されます。bar="xyz"><abc/><!--test--><xyz/></foo>そのほかの型の内容は有効なXML文字データにフォーマットされます。これは特に文字<、>、および&がエンティティに変換されることを意味します。バイナリデータ(データ型はbytea)は、設定パラメータxmlbinaryの設定にしたがって、base64もしくは16進符号化方式で表現されます。個々のデータ型に対する特定の動作は、XMLスキーマ仕様でのSQLおよびPostgreSQLデータ型に調整するため発展すると期待されます。その時点で記述がより詳細になるでしょう。...])xmlforest式は与えられた名前と内容を使用し、要素のXMLフォレスト(シーケンス)を生成します。...第2の例に見られるように、内容の値が列参照の場合、要素名は省略可能です。この時は、列名がデフォルトで使用されます。ない時は、名前が指定されなければなりません。有効なXML名ではない要素名は上のxmlelementで説明した通りエスケープされます。同様にして、既にxml型であるものを除き、内容データは有効なXML内容になるようにエスケープされます。XMLフォレストは2つ以上の要素からなる場合、有効なXML文書ではないことに注意してください。したがって、xmlelement内にxmlforest式をラップすることが有用なことがあります。content])xmlpi式はXML処理命令を作成します。内容が存在すれば、その内容は?>文字シーケンスを含んではなりません。value])xmlroot式はXML値のルートノードの属性を変更します。versionが指定されていると、ルートノードのversion宣言での値を変更し、standalone設定が指定されていると、ルートノードのstandalone宣言での値を変更します。xmlaggxmlagg(xml)ここで説明している他の関数とは異なり、xmlagg関数は集約関数です。これはxmlconcatが行うように、入力値を連結する集約関数ですが、単一行内の複数の式にまたがった連結ではなく、複数行にまたがった連結を行います。集約関数を参照してください。BY句を集計呼び出しに追加することができます。<bar/><foo>abc</foo>下記は以前のバージョンで推奨されていた、非標準的な方法例です。特定のケースでは有用かもしれません。XML述語この節で記述されている式は、xml値の属性をチェックします。DOCUMENTは引数XML値が適切なXML文書であれば真を返し、そうでなければ(つまり、内容の断片)偽を返すか、もしくは引数がNULLであればNULLを返します。XML型を参照してください。REF])関数xmlexistsは第一引数のXPath式が何かしらのノードであれば真を返し、そうでなければ偽を返します。(もしいずれの引数もNULLであった場合はNULLを返します。REF句は、PostgreSQLには何の影響も与えませんが、他の実装とのSQL互換性や順応性のため、付与することができます。REFを必要としており、2つ目はオプショナルです。加えてSQL標準ではxmlexistsはXQuery式を第一引数として取る構成としていますが、PostgreSQLでは現在XQueryのサブセットにあたるXPathのみサポートしていることに注意してください。xml_is_well_formedxml_is_well_formed(text)xml_is_well_formed_document(text)xml_is_well_formed_content(text)これらの関数はtext文字列が整形式かどうかをチェックし、論理値で結果を返します。xml_is_well_formed_documentは文書が整形式かをチェックし、一方xml_is_well_formed_contentは内容が整形式かをチェックします。xml_is_well_formedは、xmloptionパラメータ値がDOCUMENTに設定されていれば前者を、CONTENTが設定されていれば後者のチェックを実施します。これは、xml_is_well_formedは単純なxml型へのキャストが成功するかの判断に有用であり、その他の2つの関数はXMLPARSEの対応による変換が成功するかの判断に有用であることを意味します。row)最後の例は、名前空間が正しく一致しているかのチェックも含むことを示しています。1.0式を評価します。nsarray])関数xpathは、XML値xmlに対し、XPath式xpath(ひとつのtext値)を評価します。XPath式で作成されたノードセットに対応するXML値の配列を返します。XPath式がノードセットではなくスカラー値を返す場合、単一要素の配列が返されます。2番目の引数は整形済XML文書でなければなりません。単一のルートノード要素を持たなければなりません。オプショナルな関数の3番目の引数は名前空間マッピング配列です。この配列は、第2軸が2に等しい長さをもつ2次元text配列です(つまり、それは配列の配列で、それぞれは正確に2つの要素からなります)。それぞれの配列のエントリの最初の要素は名前空間の名前(別名)で、2番目は名前空間のURIです。この配列内で提供される別名がXML文書自身で使用されるものと同じであることは必要ではありません(言い換えると、XML文書内およびxpath関数の両方の文脈の中で、別名はローカルです)。row)デフォルト(匿名)名前空間を取り扱うためには、以下のようなことを実施してください。nsarray])関数xpath_existsは、xpath関数の特別な形式です。この関数は、XPathを満足する個別のXML値を返す代わりに、問い合わせがそれを満足するかどうかを論理値で返します。この関数は、名前空間にマッピングされた引数をもサポートする点を除き、標準のXMLEXISTS述語と同じです。XMLにテーブルをマップ以下の関数はリレーショナルテーブルの内容をXML値にマップします。これらはXMLエクスポート機能と考えることができます。text)それぞれの関数の戻り値型はxmlです。table_to_xmlは、パラメータtblとして渡された名前付きのテーブルの内容をマップします。regclass型はオプションのスキーマ修飾と二重引用符を含む、通常の表記法を使用しテーブルを特定する文字列を受け付けます。query_to_xmlは、パラメータqueryとしてテキストが渡された問い合わせを実行し、結果セットをマップします。cursor_to_xmlは、パラメータcursorで指定されたカーソルから提示された行数を取得します。それぞれの関数により結果値がメモリーに構築されるため、この異形は巨大なテーブルをマップする必要がある場合推奨されます。tableforestが偽であれば、結果のXML文書は以下のようになります。...</tablename>tableforestが真であれば、結果は以下のようなXML文書の断片です。...</tablename>...テーブル名が利用できないとき、つまり、問い合わせ、またはカーソルをマップする時は、最初の書式では文字列tableが使用され、2番目の書式ではrowが使用されます。これらどの書式を選択するのかはユーザ次第です。最初の書式は適切なXML文書で、多くのアプリケーションにおいて重要です。第2の書式は、後に結果値が1つの文書に再び組み立てられる場合、cursor_to_xml関数内でより有用になる傾向があります。上記で説明したXML内容を作成する関数、特にxmlelementは結果を好みにかえるために使用することができます。データの値は上記関数xmlelementで説明したのと同じ方法でマップされます。パラメータnullsは出力にNULL値が含まれる必要があるかを決定します。真であれば列内のNULL値は以下のように表現されます。xsi:nil="true"/>ここでxsiはXMLスキーマインスタンスに対するXML名前空間接頭辞です。適切な名前空間宣言が結果値に追加されます。偽の場合、NULL値を含む列は単に出力から削除されます。パラメータtargetnsは結果の希望するXML名前空間を指定します。特定の名前空間が必要なければ、空文字列を渡す必要があります。以下の関数は、対応する上記関数により行われたマッピングを記述するXMLスキーマ文書を返します。text)一致するXMLデータマッピングとXMLスキーマ文書を取得するため、同じパラメータが渡されることが不可欠です。以下の関数は、XMLデータマッピングとそれに対応するXMLスキーマがお互いにリンクされた、1つの文書(またはフォレスト)を作成します。これらは自己完結した、自己記述的な結果を希望する場合に便利です。text)さらに、以下の関数がスキーマ全体、または現在のデータベース全体の類似マッピングを作成するため利用できます。text)これらはメモリー内に作成される必要がある、多くのデータを生成する潜在的可能性があることに注意してください。巨大なスキーマ、またはデータベースの内容マッピングを要求する際は、その代わりにテーブルを別々にマップすること、さらにはカーソル経由とすることさえ、検討することは無駄ではありません。スキーマ内容マッピングの結果は以下のようになります。<schemaname>table1-mappingtable2-mapping...</schemaname>ここで、テーブルマッピング書式は上で説明したとおりtableforestパラメータに依存します。データベース内容マッピング書式は以下のようになります。...</schema2name>...</dbname>ここで、スキーママッピングは上記のとおりです。これらの関数で作成された出力を使用する1つの例として、図9.1「SQL/XML出力をHTMLに変換するXSLTスタイルシート」は、テーブルデータの表形式への翻訳を含むtable_to_xml_and_xmlschemaからHTML文書への出力の変換をおこなうXSLTスタイルシートを示します。同じようにして、これらの関数の結果は他のXML基準書式に変換されます。