¾�ΥС�������ʸ�� �� 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

9.14. XML�ؿ�

����������������ؿ�����ӵ����ؿ����ϡ�xml�����ͤ��Ф��Ƶ�ǽ���ޤ���xml���ˤĤ��Ƥξ����項8.13���������Ƥ���������xml���Τ��Ȥ���Ѵ�����xmlparse�����xmlserialize�����ؿ����Ϥ����ǤϷ����֤��ޤ��󡣤�����¿���δؿ�����Ѥ���ˤϡ����󥹥ȥ졼�����κ�configure --with-libxml�դ��ǥӥ�ɤ���Ƥ��뤳�Ȥ�ɬ�פǤ���

9.14.1. XML���Ƥ�����

SQL�ǡ�������XML���Ƥ��������뤿��˴ؿ��ȵ����ؿ����ΰ켰���󶡤���Ƥ��ޤ������Τ褦�ʤ�ΤȤ��ơ����饤����ȥ��ץꥱ���������䤤��碌��̤�����Τ����XMLʸ��˥ե����ޥåȤ���Τˤ����ؿ��ȵ����ؿ������ä�Ŭ���Ƥ��ޤ���

9.14.1.1. xmlcomment

xmlcomment(text)

�ؿ�xmlcomment������Υƥ����Ȥ����ƤȤ���XML�����Ȥ�ޤ��XML�ͤ�������ޤ����ƥ����ȤˤϷ�̤Ȥ��ƹ��ۤ����XML�����Ȥ�ͭ���ˤʤ�褦--�⤷����-�ǽ��뤹�����Ƥ�ޤ�ǤϤʤ�ޤ��󡣰�����NULL�ʤ�з�̤�NULL�ˤʤ�ޤ���

Example:

SELECT xmlcomment('hello');

  xmlcomment
--------------
 <!--hello-->

9.14.1.2. xmlconcat

 xmlconcat(xml[, ...])
 

�ؿ�xmlconcat�ϡ�XML���������Ҥ�ޤ�ñ����ͤ�������뤿��θ��̤�XML�ͤΥꥹ�Ȥ��礷�ޤ����̥��ͤϺ�����졢NULL�ʳ��ΰ�����¸�ߤ��ʤ��Ȥ��Τ߷�̤ϥ̥�ˤʤ�ޤ���

Example:

SELECT xmlconcat('<abc/>', '<bar>foo</bar>');

      xmlconcat
----------------------
 <abc/><bar>foo</bar>

XML������󼨤���Ƥ�����ϼ��Τ褦�ˤޤȤ�뤳�Ȥ��Ǥ��ޤ������Ƥΰ������ͤ�Ʊ���XMLversion�������äƤ���С�����version����̤˻��Ѥ���ޤ�������ʤ����version�ϻ��Ѥ���ޤ��󡣤⤷���Ƥΰ������ͤ�standalone����ͤǤ���"yes"�Ǥ���С������ͤ���̤˻��Ѥ���ޤ����⤷���Ƥΰ������ͤ�standalone����ͤǤ��ꡢ������ǣ��ĤǤ�"no"�������硢���줬��̤˻��Ѥ���ޤ�������ʤ���С���̤�standalone���������ޤ��󡣤⤷��̤�standalone�����ɬ�פȤ��Ƥ��Ƥ⡢standalone������ʤ����ˤϡ�XML��version�����ޤ�XML������׵᤹�뤿�ᡢversion 1.0��version��������Ѥ���ޤ���encoding�����̵�뤵�졢���Ƥξ��Ǻ������ޤ���

�㡧

SELECT xmlconcat('<?xml version="1.1"?><foo/>', '<?xml version="1.1" standalone="no"?><bar/>');

             xmlconcat
-----------------------------------
 <?xml version="1.1"?><foo/><bar/>

9.14.1.3. xmlelement

 xmlelement(name name [, xmlattributes(value [AS attname] [, ... ])] [, content, ...])
 

xmlelement����Ϳ����줿̾����°������������Ƥ����XML���Ǥ��������ޤ���

�㡧

SELECT xmlelement(name foo);

 xmlelement
------------
 <foo/>

SELECT xmlelement(name foo, xmlattributes('xyz' as bar));

    xmlelement
------------------
 <foo bar="xyz"/>

SELECT xmlelement(name foo, xmlattributes(current_date as bar), 'cont', 'ent');

             xmlelement
-------------------------------------
 <foo bar="2007-01-26">content</foo>

ͭ���Ǥʤ�XML̾�����Ǥ�°��̾�ϡ���������_xHHHH_�ˤ���ˡ��ʸ�����ִ����뤳�Ȥǥ��������פ���ޤ��������ǡ�HHHH�ϣ����ʿ��ˤ�뤽��ʸ����Unicodeʸ���������ֹ�Ǥ�����򤢤��ޤ���

SELECT xmlelement(name "foo$bar", xmlattributes('xyz' as "a&b"));

            xmlelement
----------------------------------
 <foo_x0024_bar a_x0026_b="xyz"/>

°���ͤ��󻲾Ȥξ�硢����Ū��°��̾����ꤹ��ɬ�פϤ���ޤ��󡣤��ξ�硢�ǥե���Ȥ���̾��°��̾�Ȥ��ƻ��Ѥ���ޤ�������¾�ξ�硢°��������Ū��̾����Ϳ�����ʤ���Фʤ�ޤ��󡣽��äơ��ʲ������ͭ���Ǥ���

CREATE TABLE test (a xml, b xml);
SELECT xmlelement(name test, xmlattributes(a, b)) FROM test;

���������ʲ������ͭ���ǤϤ���ޤ���

SELECT xmlelement(name test, xmlattributes('constant'), a, b) FROM test;
SELECT xmlelement(name test, xmlattributes(func(a, b))) FROM test;

�⤷�������Ƥ����ꤵ���Хǡ������˽��äƽ񼰲�����ޤ����⤷���Ƥ��Τ�Τ�xml���Ǥ���С�ʣ��XMLʸ�񤬹��ۤ���ޤ�����򤢤��ޤ���

SELECT xmlelement(name foo, xmlattributes('xyz' as bar),
                            xmlelement(name abc),
                            xmlcomment('test'),
                            xmlelement(name xyz));

                  xmlelement
----------------------------------------------
 <foo bar="xyz"><abc/><!--test--><xyz/></foo>

���Τۤ��η������Ƥ�ͭ����XMLʸ���ǡ����˥ե����ޥåȤ���ޤ���������ä�ʸ��<��>�������&������ƥ��ƥ����Ѵ�����뤳�Ȥ��̣���ޤ����Х��ʥ�ǡ����ʥǡ�������bytea�ˤϡ������ѥ�᡼��xmlbinary������ˤ������äơ�base64�⤷����16����沽������ɽ������ޤ����ġ��Υǡ��������Ф�������ο����񤤤ϡ�XML�������޻��ͤǤ�SQL�����PostgreSQL�ǡ�������Ĵ�����뤿��Ÿ�������ȴ��Ԥ���ޤ������λ����Ǥ��ܺ٤ʵ��Ҥ��и����ޤ���

9.14.1.4. xmlforest

 xmlforest(content [AS name] [, ...])
 

xmlforest����Ϳ����줿̾�������Ƥ���Ѥ������Ǥ�XML�ե��쥹�ȡʥ������󥹡ˤ��������ޤ���

�㡧

SELECT xmlforest('abc' AS foo, 123 AS bar);

          xmlforest
------------------------------
 <foo>abc</foo><bar>123</bar>


SELECT xmlforest(table_name, column_name) FROM information_schema.columns WHERE table_schema = 'pg_catalog';

                                         xmlforest
-------------------------------------------------------------------------------------------
 <table_name>pg_authid</table_name><column_name>rolname</column_name>
 <table_name>pg_authid</table_name><column_name>rolsuper</column_name>
 ...

�裲����˸�����褦�ˡ����Ƥ��ͤ��󻲾Ȥξ������̾�Ͼ�ά��ǽ�Ǥ������ξ�硢��̾���ǥե���Ȥǻ��Ѥ���ޤ��������Ǥʤ���硢̾�������ꤵ��ʤ���Фʤ�ޤ���

ͭ����XML̾�ǤϤʤ�����̾�Ͼ��xmlelement�����������̤ꥨ�������פ���ޤ���Ʊ�ͤˤ��ơ���������xml���Ǥʤ����������ƥǡ�����ͭ����XML���Ƥˤʤ�褦�˥��������פ���ޤ���

XML�ե��쥹�Ȥϣ��İʾ�����Ǥ���ʤ��硢ͭ����XMLʸ��ǤϤ���ޤ��󡣤������äơ�xmlelement��xmlforest�����åפ��뤳�Ȥ�ͭ�Ѥʤ��Ȥ�����ޤ���

9.14.1.5. xmlpi

 xmlpi(name target [, content])
 

xmlpi����XML����̿���������ޤ������Ƥ�¸�ߤ���С��������Ƥ�?>ʸ���������󥹤�ޤ�ǤϤʤ�ޤ���

Example:

SELECT xmlpi(name php, 'echo "hello world";');

            xmlpi
-----------------------------
 <?php echo "hello world";?>

9.14.1.6. xmlroot

 xmlroot(xml, version text|no value [, standalone yes|no|no value])
 

xmlroot����XML�ͤΥ롼�ȥΡ��ɤ�°�����ѹ����ޤ���version�����ꤵ��Ƥ���ȡ�version����Ǥ��ͤ��ѹ�����standalone�ͤ����ꤵ��Ƥ���ȡ�standalone����Ǥ��ͤ��ѹ����ޤ���

SELECT xmlroot(xmlparse(document '<?xml version="1.1"?><content>abc</content>'), version '1.0', standalone yes);

                xmlroot
----------------------------------------
 <?xml version="1.0" standalone="yes"?>
 <content>abc</content>

9.14.1.7. xmlagg

xmlagg(xml)

�������������Ƥ���ؿ��Ȥϰۤʤꡢxmlagg�ؿ��Ͻ���ؿ��Ǥ���xmlconcat���Ԥ��褦�ˡ������ͤ���ؿ��ƤӽФ���Ϣ�뤷�ޤ�������ؿ��ˤĤ��Ƥΰ��̾����項9.18�򻲾Ȥ��Ƥ���������

�㡧

CREATE TABLE test (y int, x xml);
INSERT INTO test VALUES (1, '<foo>abc</foo>');
INSERT INTO test VALUES (2, '<bar/>');
SELECT xmlagg(x) FROM test;
        xmlagg
----------------------
 <foo>abc</foo><bar/>

���ߤμ����ˤ�����Ϣ��ν���ϸ�§�Ȥ����������Ƥ��ʤ����Ȥ����դ��Ƥ����������������������ͤ��̤η�����¸���뤳�Ȥ��ǽ�Ǥ����㤨�С��嵭����ˤ����Ƽ��Τ褦�ˤ��ƽ���˱ƶ���Ϳ���뤳�Ȥ�Ǥ���Ǥ��礦��

SELECT xmlagg(x) FROM (SELECT * FROM test ORDER BY y DESC) AS tab;
        xmlagg
----------------------
 <bar/><foo>abc</foo>

���������μ�ˡ�Ϥ�������̤䡢���٤Ƥ�PostgreSQL�ΥС��������Ф����ݾ㤵��Ƥ���櫓�ǤϤ���ޤ��󡣾����PostgreSQL�С������ϡ�xmlagg(expr ORDER BY expr, expr, ... �Τ褦�ʡ��������ˡ�Ǥ��ν�������椹���ɲõ�ǽ���󶡤��Ƥ���뤫�⤷��ޤ���

9.14.1.8. XML�Ҹ�

xml IS DOCUMENT

��IS DOCUMENT�ϰ���XML�ͤ�Ŭ�ڤ�XMLʸ��Ǥ���п����֤��������Ǥʤ���СʤĤޤꡢ���Ƥ����ҡ˵����֤������⤷���ϰ�����NULL�Ǥ����NULL���֤��ޤ���ʸ������Ƥ����Ҥκ��ۤˤĤ��Ƥ�項8.13�򻲾Ȥ��Ƥ���������

9.14.2. Processing XML

�ǡ�����xml���ͤ�������뤿�ᡢPostgreSQL�ϴؿ�xpath���󶡤��Ƥ��ơ������XPath 1.0����ɾ�����ޤ���

xpath(xpath, xml[, nsarray])

�ؿ�xpath�ϡ�XML��xml���Ф���XPath��xpath��ɾ�����ޤ��������ơ�XPath���Ǻ������줿�Ρ��ɥ��åȤ��б�����XML�ͤ�������֤��ޤ���

�ؿ��Σ����ܤΰ�����̾�����֥ޥåԥ�����Ǥ�����������ϡ��裲��������������Ĺ�����ģ���������Ǥ��ʤĤޤꡢ��������������ǡ����줾������Τˣ��Ĥ����Ǥ���ʤ�ޤ��ˡ����줾�������Υ���ȥ�κǽ�����Ǥ�̾�����֤�̾���ǡ������ܤ�̾�����֤�URI�Ǥ���

Example:

SELECT xpath('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>', ARRAY[ARRAY['my', 'http://example.com']]);

 xpath  
--------
 {test}
(1 row)

9.14.3. XML�˥ơ��֥��ޥå�

�ʲ��δؿ��ϥ�졼����ʥ�ơ��֥�����Ƥ�XML�ͤ˥ޥåפ��ޤ���������XML�������ݡ��ȵ�ǽ�ȹͤ��뤳�Ȥ��Ǥ��ޤ���

table_to_xml(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xml(query text, nulls boolean, tableforest boolean, targetns text)
cursor_to_xml(cursor refcursor, count int, nulls boolean, tableforest boolean, targetns text)

���줾��δؿ�������ͷ���xml�Ǥ���

table_to_xml�ϡ��ѥ�᡼��tbl�Ȥ����Ϥ��줿̾���դ��Υơ��֥�����Ƥ�ޥåפ��ޤ���regclass���ϥ��ץ����Υ������޽�������Ű������ޤࡢ�̾��ɽ��ˡ����Ѥ��ơ��֥�����ꤹ��ʸ���������դ��ޤ���query_to_xml�ϡ��ѥ�᡼��query�Ȥ��ƥƥ����Ȥ��Ϥ��줿�䤤��碌��¹Ԥ�����̥��åȤ�ޥåפ��ޤ���cursor_to_xml�ϡ��ѥ�᡼��cursor�ǻ��ꤵ�줿�������뤫���󼨤��줿�Կ���������ޤ��������Ѱ۷��ϡ����줾��δؿ��ˤ�����ͤ����꡼�˹��ۤ���뤿�ᡢ����ʥơ��֥��ޥåפ���ɬ�פ�������侩����ޤ���

tableforest�����Ǥ���С���̤�XMLʸ��ϰʲ��Τ褦�ˤʤ�ޤ���

<tablename>
  <row>
    <columnname1>data</columnname1>
    <columnname2>data</columnname2>
  </row>

  <row>
    ...
  </row>

  ...
</tablename>

tableforest�����Ǥ���С���̤ϰʲ��Τ褦��XMLʸ������ҤǤ���

<tablename>
  <columnname1>data</columnname1>
  <columnname2>data</columnname2>
</tablename>

<tablename>
  ...
</tablename>

...

�ơ��֥�̾�����Ĥ�ͭ���Ǥʤ���С��Ĥޤꡢ�䤤��碌���ޤ��ϥ��������ޥåפ������ʸ����table���ǽ�ν񼰤ǻ��Ѥ��졢row�������ܤν񼰤ǻ��Ѥ���ޤ���

�����ɤν񼰤����򤹤�Τ��ϥ桼������Ǥ����ǽ�ν񼰤�Ŭ�ڤ�XMLʸ��ǡ�¿���Υ��ץꥱ�������ˤ����ƽ��פǤ����裲�ν񼰤ϡ���˷���ͤ����Ĥ�ʸ��˺Ƥ��Ȥ�Ω�Ƥ����硢cursor_to_xml�ؿ���Ǥ��ͭ�Ѥˤʤ뷹��������ޤ����嵭����������XML���Ƥ��������ؿ����ä�xmlelement�Ϸ�̤򹥤ߤˤ����뤿��˻��Ѥ��뤳�Ȥ��Ǥ��ޤ���

�ǡ������ͤϾ嵭�ؿ�xmlelement�����������Τ�Ʊ����ˡ�ǥޥåפ���ޤ���

�ѥ�᡼��nulls�Ͻ��Ϥ�NULL�ͤ��ޤޤ��ɬ�פ����뤫����ꤷ�ޤ����⤷���Ǥ���������NULL�ͤϰʲ��Τ褦��ɽ������ޤ���

<columnname xsi:nil="true"/>

������xsi��XML�������ޥ��󥹥��󥹤��Ф���XML̾��������Ƭ���Ǥ���Ŭ�ڤ�̾���������������ͤ��ɲä���ޤ����⤷���ξ�硢NULL�ͤ�ޤ����ñ�˽��Ϥ���������ޤ���

�ѥ�᡼��targetns�Ϸ�̤δ�˾����XML̾�����֤���ꤷ�ޤ��������̾�����֤�ɬ�פʤ���С���ʸ������Ϥ�ɬ�פ�����ޤ���

�ʲ��δؿ��ϡ��б�����嵭�ؿ��ˤ��������줿�ǡ����ޥåԥ󥰤Ǻ��줿�ޥåԥ󥰤���������XML��������ʸ����֤��ޤ���

table_to_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
cursor_to_xmlschema(cursor refcursor, nulls boolean, tableforest boolean, targetns text)

�ޥå�����XML�ǡ����ޥåԥ󥰤�XML��������ʸ���������뤿�ᡢƱ���ѥ�᡼�����Ϥ���뤳�Ȥ��Բķ�Ǥ���

�ʲ��δؿ��ϡ�XML�ǡ����ޥåԥ󥰤Ȥ�����б�����XML�������ޤ����ߤ��˥�󥯤��줿�����Ĥ�ʸ��ʤޤ��ϥե��쥹�ȡˤ�������ޤ��������ϼ��ʴ��뤷�������ʵ���Ū�ʷ�̤��˾������������Ǥ���

table_to_xml_and_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xml_and_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)

����ˡ��ʲ��δؿ��������������Ρ��ޤ��ϸ��ߤΥǡ����١������Τ�����ޥåԥ󥰤�������뤿�����ѤǤ��ޤ���

schema_to_xml(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xml_and_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)

database_to_xml(nulls boolean, tableforest boolean, targetns text)
database_to_xmlschema(nulls boolean, tableforest boolean, targetns text)
database_to_xml_and_xmlschema(nulls boolean, tableforest boolean, targetns text)

�����ϥ��꡼��˺��������ɬ�פ����롢¿���Υǡ�����������������Ū��ǽ�������뤳�Ȥ����դ��Ƥ�������������ʥ������ޡ��ޤ��ϥǡ����١��������ƥޥåԥ󥰤��׵᤹��ݤϡ����������ͳ�β�ǽ�������äƤ⡢��������˥ơ��֥���̡��˥ޥåפ��뤳�Ȥ�Ƥ���뤳�Ȥ�̵�̤ǤϤ���ޤ���

�����������ƥޥåԥ󥰤η�̤ϰʲ��Τ褦�ˤʤ�ޤ���

<schemaname>

table1-mapping

table2-mapping

...

</schemaname>

�����ǡ��ơ��֥�ޥåԥ󥰽񼰤Ͼ�����������Ȥ���tableforest�ѥ�᡼���˰�¸���ޤ���

�ǡ����١������ƥޥåԥ󥰽񼰤ϰʲ��Τ褦�ˤʤ�ޤ���

<dbname>

<schema1name>
  ...
</schema1name>

<schema2name>
  ...
</schema2name>

...

</dbname>

�����ǡ��������ޥޥåԥ󥰤Ͼ嵭�ΤȤ���Ǥ���

�����δؿ��Ǻ������줿���Ϥ���Ѥ��룱�Ĥ���Ȥ��ơ�図9-1�ϡ��ơ��֥�ǡ�����ɽ�����ؤ�������ޤ�table_to_xml_and_xmlschema����HTMLʸ��ؤν��Ϥ��Ѵ��򤪤��ʤ�XSLT�������륷���Ȥ򼨤��ޤ���Ʊ���褦�ˤ��ơ������δؿ��η�̥ǡ�����¾��XML���񼰤��Ѵ�����ޤ���

図 9-1. SQL/XML���Ϥ�HTML���Ѵ�����XSLT�������륷����

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.w3.org/1999/xhtml"
>

  <xsl:output method="xml"
      doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
      doctype-public="-//W3C/DTD XHTML 1.0 Strict//EN"
      indent="yes"/>

  <xsl:template match="/*">
    <xsl:variable name="schema" select="//xsd:schema"/>
    <xsl:variable name="tabletypename"
                  select="$schema/xsd:element[@name=name(current())]/@type"/>
    <xsl:variable name="rowtypename"
                  select="$schema/xsd:complexType[@name=$tabletypename]/xsd:sequence/xsd:element[@name='row']/@type"/>

    <html>
      <head>
        <title><xsl:value-of select="name(current())"/></title>
      </head>
      <body>
        <table>
          <tr>
            <xsl:for-each select="$schema/xsd:complexType[@name=$rowtypename]/xsd:sequence/xsd:element/@name">
              <th><xsl:value-of select="."/></th>
            </xsl:for-each>
          </tr>

          <xsl:for-each select="row">
            <tr>
              <xsl:for-each select="*">
                <td><xsl:value-of select="."/></td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>