9.15. XML-ÑÑнкÑии #
ФÑнкÑии и подобнÑе им вÑÑажениÑ, опиÑаннÑе в ÑÑом Ñазделе, ÑабоÑаÑÑ Ñо знаÑениÑми Ñипа xml. ÐнÑоÑмаÑÐ¸Ñ Ð¾ Ñипе xml Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе найÑи в Разделе 8.13. ÐодобнÑе ÑÑнкÑиÑм вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ xmlparse и xmlserialize, пÑеобÑазÑÑÑие знаÑÐµÐ½Ð¸Ñ xml в ÑекÑÑ Ð¸ обÑаÑно, здеÑÑ Ð¿Ð¾Ð²ÑоÑно не ÑаÑÑмаÑÑиваÑÑÑÑ.
ÐÐ»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑиÑ
ÑÑнкÑий Postgres Pro нÑжно задейÑÑвоваÑÑ ÑооÑвеÑÑÑвÑÑÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ Ð¿Ñи ÑбоÑке: configure --with-libxml.
9.15.1. Создание XML-конÑенÑа #
ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ XML-конÑенÑа из даннÑÑ SQL ÑÑÑеÑÑвÑÐµÑ ÑелÑй Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий и ÑÑнкÑионалÑнÑÑ Ð²ÑÑажений, оÑобенно полезнÑÑ Ð´Ð»Ñ Ð²ÑдаÑи клиенÑÑким пÑиложениÑм ÑезÑлÑÑаÑов запÑоÑа в виде XML-докÑменÑов.
9.15.1.1. xmlcomment #
xmlcomment(text) âxml
ФÑнкÑÐ¸Ñ xmlcomment ÑоздаÑÑ XML-знаÑение, ÑодеÑжаÑее XML-комменÑаÑий Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм ÑекÑÑом. ÐÑÐ¾Ñ ÑекÑÑ Ð½Ðµ должен ÑодеÑжаÑÑ Â«--» или заканÑиваÑÑÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼ «-», в пÑоÑивном ÑлÑÑае ÑезÑлÑÑÐ°Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð´Ð¾Ð¿ÑÑÑимÑм XML-комменÑаÑием. ÐÑли аÑгÑÐ¼ÐµÐ½Ñ ÑÑой ÑÑнкÑии NULL, ÑезÑлÑÑаÑом ÐµÑ Ñоже бÑÐ´ÐµÑ NULL.
ÐÑимеÑ:
SELECT xmlcomment('hello');
xmlcomment
--------------
<!--hello-->
9.15.1.2. xmlconcat #
xmlconcat(xml[, ...] ) âxml
ФÑнкÑÐ¸Ñ xmlconcat обÑединÑÐµÑ Ð½ÐµÑколÑко XML-знаÑений и вÑдаÑÑ Ð² ÑезÑлÑÑаÑе один ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ XML-конÑенÑа. ÐнаÑÐµÐ½Ð¸Ñ NULL оÑбÑаÑÑваÑÑÑÑ, Ñак ÑÑо ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ñавен NULL, ÑолÑко еÑли вÑе аÑгÑменÑÑ ÑÐ°Ð²Ð½Ñ NULL.
ÐÑимеÑ:
SELECT xmlconcat('<abc/>', '<bar>foo</bar>');
xmlconcat
----------------------
<abc/><bar>foo</bar>
XML-обÑÑвлениÑ, еÑли они пÑиÑÑÑÑÑвÑÑÑ, обÑабаÑÑваÑÑÑÑ ÑледÑÑÑим обÑазом. ÐÑли во вÑÐµÑ Ð°ÑгÑменÑÐ°Ñ ÑодеÑжаÑÑÑ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¹ веÑÑии XML, ÑÑа веÑÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñдана в ÑезÑлÑÑаÑе; в пÑоÑивном ÑлÑÑае веÑÑии не бÑдеÑ. ÐÑли во вÑÐµÑ Ð°ÑгÑменÑÐ°Ñ Ð¾Ð¿ÑеделÑн аÑÑибÑÑ standalone Ñо знаÑением «yes», ÑÑо же знаÑение бÑÐ´ÐµÑ Ð²Ñдано в ÑезÑлÑÑаÑе. ÐÑли во вÑÐµÑ Ð°ÑгÑменÑÐ°Ñ ÐµÑÑÑ Ð¾Ð±ÑÑвление standalone, но минимÑм в одном Ñо знаÑением «no», в ÑезÑлÑÑаÑе бÑÐ´ÐµÑ ÑÑо знаÑение. РпÑоÑивном ÑлÑÑае в ÑезÑлÑÑаÑе не бÑÐ´ÐµÑ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ standalone. ÐÑли же окажеÑÑÑ, ÑÑо в ÑезÑлÑÑаÑе должно пÑиÑÑÑÑÑвоваÑÑ Ð¾Ð±ÑÑвление standalone, а веÑÑÐ¸Ñ Ð½Ðµ опÑеделена, Ñогда в ÑезÑлÑÑаÑе бÑÐ´ÐµÑ Ð²Ñведена веÑÑÐ¸Ñ 1.0, Ñак как XML-обÑÑвление не бÑÐ´ÐµÑ Ð´Ð¾Ð¿ÑÑÑимÑм без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð²ÐµÑÑии. Ð£ÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñовки игноÑиÑÑÑÑÑÑ Ð¸ бÑдÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð² лÑбÑÑ ÑлÑÑаÑÑ .
ÐÑимеÑ:
SELECT xmlconcat('<?xml version="1.1"?><foo/>', '<?xml version="1.1" standalone="no"?><bar/>');
xmlconcat
-----------------------------------
<?xml version="1.1"?><foo/><bar/>
9.15.1.3. xmlelement #
xmlelement(NAMEимÑ[,XMLATTRIBUTES(знаÑение_аÑÑибÑÑа[ASаÑÑибÑÑ] [, ...] )] [,ÑодеÑжимое[, ...]] ) âxml
ÐÑÑажение xmlelement ÑоздаÑÑ XML-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм именем, аÑÑибÑÑами и ÑодеÑжимÑм. ÐÑгÑменÑÑ Ð¸Ð¼Ñ Ð¸ знаÑение_аÑÑибÑÑа, показаннÑе в ÑинÑакÑиÑе, обознаÑаÑÑ Ð¿ÑоÑÑÑе иденÑиÑикаÑоÑÑ, а не опÑеделÑннÑе знаÑениÑ. ÐÑгÑменÑÑ Ð·Ð½Ð°Ñение_аÑÑибÑÑа и ÑодеÑжимое ÑвлÑÑÑÑÑ Ð²ÑÑажениÑми, коÑоÑÑе могÑÑ Ð²ÑдаваÑÑ Ð»Ñбой Ñип даннÑÑ
Postgres Pro. ÐÑгÑменÑÑ Ð²Ð½ÑÑÑи XMLATTRIBUTES генеÑиÑÑÑÑ Ð°ÑÑибÑÑÑ 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, ÑÑи ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð·Ð°Ð¼ÐµÐ½ÑÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми _x, где HHHH_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. ÐÑо, в ÑаÑÑноÑÑи, ознаÑаеÑ, ÑÑо ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ <, > и & бÑдÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ Ð² ÑÑÑноÑÑи XML. ÐвоиÑнÑе даннÑе (даннÑе Ñипа bytea) пÑедÑÑавлÑÑÑÑÑ Ð² кодиÑовке base64 или в ÑеÑÑнадÑаÑеÑиÑном виде, в завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑа xmlbinary. СледÑÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ, ÑÑо конкÑеÑнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾ÑделÑнÑÑ
Ñипов даннÑÑ
могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð´Ð»Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿ÑеобÑазований Postgres Pro в ÑооÑвеÑÑÑвие Ñо ÑÑандаÑÑом SQL:2006 и новее, как опиÑано в ÐодÑазделе D.3.1.3.
9.15.1.4. xmlforest #
xmlforest(ÑодеÑжимое[ASимÑ] [, ...] ) âxml
ÐÑÑажение xmlforest ÑоздаÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ XML-ÑлеменÑов Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми именами и ÑодеÑжимÑм. Ðак и в ÑÑнкÑии xmlelement, каждÑй аÑгÑÐ¼ÐµÐ½Ñ Ð¸Ð¼Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¿ÑоÑÑÑм иденÑиÑикаÑоÑом, а вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑодеÑжимое могÑÑ Ð¸Ð¼ÐµÑÑ Ð»Ñбой Ñип даннÑÑ
.
ÐÑимеÑÑ:
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-докÑменÑами, еÑли они ÑодеÑÐ¶Ð°Ñ Ð±Ð¾Ð»ÑÑе одного ÑлеменÑа на веÑÑ
нем ÑÑовне, поÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл вложиÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ xmlforest в xmlelement.
9.15.1.5. xmlpi #
xmlpi(NAMEимÑ[,ÑодеÑжимое] ) âxml
ÐÑÑажение xmlpi ÑоздаÑÑ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ Ð¾Ð±ÑабоÑки XML. Ðак и в ÑÑнкÑии xmlelement, аÑгÑÐ¼ÐµÐ½Ñ Ð¸Ð¼Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¿ÑоÑÑÑм иденÑиÑикаÑоÑом, а вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑодеÑжимое могÑÑ Ð¸Ð¼ÐµÑÑ Ð»Ñбой Ñип даннÑÑ
. СодеÑжимое, еÑли оно задано, не должно ÑодеÑжаÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ñимволов ?>.
ÐÑимеÑ:
SELECT xmlpi(name php, 'echo "hello world";');
xmlpi
-----------------------------
<?php echo "hello world";?>
9.15.1.6. xmlroot #
xmlroot(xml,VERSION{text|NO VALUE} [,STANDALONE{YES|NO|NO VALUE}] ) âxml
ÐÑÑажение xmlroot изменÑÐµÑ ÑвойÑÑва коÑневого Ñзла XML-знаÑениÑ. ÐÑли в нÑм ÑказÑваеÑÑÑ Ð²ÐµÑÑиÑ, она заменÑÐµÑ Ð·Ð½Ð°Ñение в обÑÑвлении веÑÑии коÑневого Ñзла; Ñакже в коÑневой Ñзел пеÑеноÑиÑÑÑ Ð·Ð½Ð°Ñение ÑвойÑÑва 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.15.1.7. xmlagg #
xmlagg(xml) âxml
ФÑнкÑÐ¸Ñ xmlagg, в оÑлиÑие Ð¾Ñ Ð´ÑÑгиÑ
опиÑаннÑÑ
здеÑÑ ÑÑнкÑий, ÑвлÑеÑÑÑ Ð°Ð³ÑегаÑной. Ðна ÑоединÑÐµÑ Ð·Ð½Ð°ÑениÑ, поÑÑÑпаÑÑие на вÑ
од агÑегаÑной ÑÑнкÑии, подобно ÑÑнкÑии xmlconcat, но Ð´ÐµÐ»Ð°ÐµÑ ÑÑо, обÑабаÑÑÐ²Ð°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑÑÑок, а не неÑколÑко вÑÑажений в одной ÑÑÑоке. ÐополниÑелÑно агÑегаÑнÑе ÑÑнкÑии опиÑÐ°Ð½Ñ Ð² Разделе 9.21.
ÐÑимеÑ:
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/>
ЧÑÐ¾Ð±Ñ Ð·Ð°Ð´Ð°ÑÑ Ð¿Ð¾ÑÑдок ÑÐ»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑлеменÑов, в агÑегаÑнÑй вÑзов можно добавиÑÑ Ð¿Ñедложение ORDER BY, опиÑанное в ÐодÑазделе 4.2.7. ÐапÑимеÑ:
SELECT xmlagg(x ORDER BY y DESC) FROM test;
xmlagg
----------------------
<bar/><foo>abc</foo>
СледÑÑÑий неÑÑандаÑÑнÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´ ÑекомендовалÑÑ Ð² пÑедÑдÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ Ð¸ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ в некоÑоÑÑÑ ÑлÑÑаÑÑ :
SELECT xmlagg(x) FROM (SELECT * FROM test ORDER BY y DESC) AS tab;
xmlagg
----------------------
<bar/><foo>abc</foo>
9.15.2. УÑÐ»Ð¾Ð²Ð¸Ñ Ñ XML #
ÐпиÑаннÑе в ÑÑом Ñазделе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑовеÑÑÑÑ ÑвойÑÑва знаÑений xml.
9.15.2.1. IS DOCUMENT #
xmlIS DOCUMENTâboolean
ÐÑÑажение IS DOCUMENT возвÑаÑÐ°ÐµÑ true, еÑли аÑгÑÐ¼ÐµÐ½Ñ Ð¿ÑедÑÑавлÑÐµÑ Ñобой пÑавилÑнÑй XML-докÑменÑ, false в пÑоÑивном ÑлÑÑае (Ñ. е. еÑли ÑÑо ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÑодеÑжимого) и NULL, еÑли его аÑгÑÐ¼ÐµÐ½Ñ Ñакже NULL. Чем докÑменÑÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ ÑÑагменÑов ÑодеÑжимого, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑзнаÑÑ Ð² Разделе 8.13.
9.15.2.2. IS NOT DOCUMENT #
xmlIS NOT DOCUMENTâboolean
ÐÑÑажение IS NOT DOCUMENT возвÑаÑÐ°ÐµÑ false, еÑли аÑгÑÐ¼ÐµÐ½Ñ Ð¿ÑедÑÑавлÑÐµÑ Ñобой пÑавилÑнÑй XML-докÑменÑ, true в пÑоÑивном ÑлÑÑае (Ñ. е. еÑли ÑÑо ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÑодеÑжимого) и NULL, еÑли его аÑгÑÐ¼ÐµÐ½Ñ â NULL.
9.15.2.3. XMLEXISTS #
XMLEXISTS(textPASSING[BY{REF|VALUE}]xml[BY{REF|VALUE}] ) âboolean
ФÑнкÑÐ¸Ñ xmlexists вÑÑиÑлÑÐµÑ Ð²ÑÑажение XPath 1.0 (пеÑвÑй аÑгÑменÑ), иÑполÑзÑÑ Ð² каÑеÑÑве ÑлеменÑа конÑекÑÑа пеÑеданное XML-знаÑение. ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ false, еÑли в ÑезÑлÑÑаÑе ÑÑого вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑдаÑÑÑÑ Ð¿ÑÑÑое множеÑÑво Ñзлов, или true, еÑли вÑдаÑÑÑÑ Ð»Ñбое дÑÑгое знаÑение. ÐÑли один из аÑгÑменÑов Ñавен NULL, ÑезÑлÑÑаÑом Ñакже бÑÐ´ÐµÑ NULL. ÐÑлиÑнÑй Ð¾Ñ NULL аÑгÑменÑ, пеÑедаÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ¾Ð½ÑекÑÑа, должен пÑедÑÑавлÑÑÑ XML-докÑменÑ, а не ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÑодеÑжимого или какое-либо знаÑение, недопÑÑÑимое в XML.
ÐÑимеÑ:
SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY VALUE '<towns><town>Toronto</town><town>Ottawa</town></towns>');
xmlexists
------------
t
(1 row)
ÐÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ BY REF и BY VALUE в Postgres Pro пÑинимаÑÑÑÑ, но игноÑиÑÑÑÑÑÑ, о ÑÑм ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе D.3.2.
СоглаÑно ÑÑандаÑÑÑ SQL, ÑÑнкÑÐ¸Ñ xmlexists должна вÑÑиÑлÑÑÑ Ð²ÑÑажение, иÑполÑзÑÑ ÑÑедÑÑва ÑзÑка XML Query, но Postgres Pro воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑолÑко вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ XPath 1.0, ÑÑо оÑвеÑаеÑÑÑ Ð² ÐодÑазделе D.3.1.
9.15.2.4. xml_is_well_formed #
xml_is_well_formed(text) âbooleanxml_is_well_formed_document(text) âbooleanxml_is_well_formed_content(text) âboolean
ÐÑи ÑÑнкÑии пÑовеÑÑÑÑ, пÑедÑÑавлÑÐµÑ Ð»Ð¸ ÑекÑÑ Ð¿ÑавилÑно оÑоÑмленнÑй XML, и возвÑаÑаÑÑ ÑооÑвеÑÑÑвÑÑÑее логиÑеÑкое знаÑение. ФÑнкÑÐ¸Ñ xml_is_well_formed_document пÑовеÑÑÐµÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ°Ðº пÑавилÑно оÑоÑмленнÑй докÑменÑ, а xml_is_well_formed_content â пÑавилÑно оÑоÑмленное ÑодеÑжимое. ФÑнкÑÐ¸Ñ xml_is_well_formed Ð¼Ð¾Ð¶ÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ð¿ÐµÑвое или вÑоÑое, в завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑа конÑигÑÑаÑии xmloption (DOCUMENT или CONTENT, ÑооÑвеÑÑÑвенно). ÐÑо знаÑиÑ, ÑÑо xml_is_well_formed Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¿Ð¾Ð½ÑÑÑ, бÑÐ´ÐµÑ Ð»Ð¸ ÑÑпеÑнÑм пÑоÑÑое пÑиведение к ÑÐ¸Ð¿Ñ xml, Ñогда как две дÑÑгие ÑÑнкÑии пÑовеÑÑÑÑ, бÑдÑÑ Ð»Ð¸ ÑÑпеÑÐ½Ñ ÑооÑвеÑÑÑвÑÑÑие ваÑианÑÑ XMLPARSE.
ÐÑимеÑÑ:
SET xmloption TO DOCUMENT;
SELECT xml_is_well_formed('<>');
xml_is_well_formed
--------------------
f
(1 row)
SELECT xml_is_well_formed('<abc/>');
xml_is_well_formed
--------------------
t
(1 row)
SET xmloption TO CONTENT;
SELECT xml_is_well_formed('abc');
xml_is_well_formed
--------------------
t
(1 row)
SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>');
xml_is_well_formed_document
-----------------------------
t
(1 row)
SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</my:foo>');
xml_is_well_formed_document
-----------------------------
f
(1 row)
ÐоÑледний пÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑ, ÑÑо пÑи пÑовеÑке Ñакже ÑÑиÑÑваÑÑÑÑ ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÑоÑÑÑанÑÑв имÑн.
9.15.3. ÐбÑабоÑка XML #
ÐÐ»Ñ Ð¾Ð±ÑабоÑки знаÑений Ñипа xml в Postgres Pro пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ ÑÑнкÑии xpath и xpath_exists, вÑÑиÑлÑÑÑие вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ XPath 1.0, а Ñакже ÑаблиÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ XMLTABLE.
9.15.3.1. xpath #
xpath(xpathtext,xmlxml[,nsarraytext[]] ) âxml[]
ФÑнкÑÐ¸Ñ xpath вÑÑиÑлÑÐµÑ Ð²ÑÑажение XPath 1.0 в аÑгÑменÑе xpath (заданное в виде ÑекÑÑа) Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ XML-знаÑÐµÐ½Ð¸Ñ xml. Ðна возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив XML-знаÑений, ÑооÑвеÑÑÑвÑÑÑиÑ
набоÑÑ Ñзлов, полÑÑÐµÐ½Ð½Ð¾Ð¼Ñ Ð¿Ñи вÑÑиÑлении вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ XPath. ÐÑли вÑÑажение XPath вÑдаÑÑ Ð½Ðµ Ð½Ð°Ð±Ð¾Ñ Ñзлов, а ÑкалÑÑное знаÑение, возвÑаÑаеÑÑÑ Ð¼Ð°ÑÑив Ñ Ð¾Ð´Ð½Ð¸Ð¼ ÑлеменÑом.
ÐÑоÑÑм аÑгÑменÑом должен бÑÑÑ Ð¿ÑавилÑно оÑоÑмленнÑй XML-докÑменÑ. Ð ÑаÑÑноÑÑи, в нÑм должен бÑÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑй коÑневой ÑлеменÑ.
РнеобÑзаÑелÑном ÑÑеÑÑем аÑгÑменÑе ÑÑнкÑии пеÑедаÑÑÑÑ ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÑоÑÑÑанÑÑв имÑн. ÐÑи ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð² двÑмеÑном маÑÑиве Ñипа text, во вÑоÑой ÑазмеÑноÑÑи коÑоÑого 2 ÑлеменÑа (Ñ. е. ÑÑо должен бÑÑÑ Ð¼Ð°ÑÑив маÑÑивов, ÑоÑÑоÑÑиÑ
из 2 ÑлеменÑов). РпеÑвом ÑлеменÑе каждого маÑÑива опÑеделÑеÑÑÑ Ð¿Ñевдоним (пÑеÑикÑ) пÑоÑÑÑанÑÑва имÑн, а во вÑоÑом â его URI. ÐÑевдонимÑ, опÑеделÑннÑе в ÑÑом маÑÑиве, не обÑзаÑелÑно Ð´Ð¾Ð»Ð¶Ð½Ñ ÑовпадаÑÑ Ñ Ð¿ÑеÑикÑами пÑоÑÑÑанÑÑв имÑн в Ñамом XML-докÑменÑе (дÑÑгими Ñловами, Ð´Ð»Ñ XML-докÑменÑа и ÑÑнкÑии xpath пÑÐµÐ²Ð´Ð¾Ð½Ð¸Ð¼Ñ Ð¸Ð¼ÐµÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑй Ñ
аÑакÑеÑ).
ÐÑимеÑ:
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)
ÐÐ»Ñ Ð¿ÑоÑÑÑанÑÑва имÑн по ÑмолÑÐ°Ð½Ð¸Ñ (анонимного) ÑÑо вÑÑажение можно запиÑаÑÑ Ñак:
SELECT xpath('//mydefns:b/text()', '<a xmlns="http://example.com"><b>test</b></a>',
ARRAY[ARRAY['mydefns', 'http://example.com']]);
xpath
--------
{test}
(1 row)
9.15.3.2. xpath_exists #
xpath_exists(xpathtext,xmlxml[,nsarraytext[]] ) âboolean
ФÑнкÑÐ¸Ñ xpath_exists пÑедÑÑавлÑÐµÑ Ñобой ÑпеÑиализиÑованнÑÑ ÑоÑÐ¼Ñ ÑÑнкÑии xpath. Ðна возвÑаÑÐ°ÐµÑ Ð½Ðµ оÑделÑнÑе XML-знаÑениÑ, ÑдовлеÑвоÑÑÑÑие вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ XPath 1.0, а ÑолÑко один логиÑеÑкий пÑизнак, показÑваÑÑий, имеÑÑÑÑ Ð»Ð¸ Ñакие знаÑÐµÐ½Ð¸Ñ (Ñо еÑÑÑ Ð²ÑдаÑÑ Ð»Ð¸ ÑÑо вÑÑажение ÑÑо-либо, оÑлиÑное Ð¾Ñ Ð¿ÑÑÑого множеÑÑва Ñзлов). ÐÑа ÑÑнкÑÐ¸Ñ ÑавнознаÑна ÑÑандаÑÑÐ½Ð¾Ð¼Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ XMLEXISTS, за иÑклÑÑением Ñого, ÑÑо она Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÑоÑÑÑанÑÑв имÑн.
ÐÑимеÑ:
SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>',
ARRAY[ARRAY['my', 'http://example.com']]);
xpath_exists
--------------
t
(1 row)
9.15.3.3. xmltable #
XMLTABLE( [XMLNAMESPACES(uri_пÑоÑÑÑанÑÑва_имÑнASимÑ_пÑоÑÑÑанÑÑва_имÑн[, ...] ),]вÑÑажение_ÑÑÑокиPASSING[BY{REF|VALUE}]вÑÑажение_докÑменÑа[BY{REF|VALUE}]COLUMNSимÑ{Ñип[PATHвÑÑажение_ÑÑолбÑа] [DEFAULTвÑÑажение_по_ÑмолÑаниÑ] [NOT NULL|NULL] |FOR ORDINALITY} [, ...] ) âsetof record
ÐÑÑажение xmltable ÑÑÑÐ¾Ð¸Ñ ÑаблиÑÑ Ð¸Ð· XML-знаÑениÑ, пÑименÑÑ ÑилÑÑÑ XPath Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ ÑÑÑок и ÑоÑмиÑÑÑ ÑÑолбÑÑ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм опÑеделением. ХоÑÑ Ð¿Ð¾ ÑинÑакÑиÑÑ Ð¾Ð½Ð¾ подобно ÑÑнкÑии, оно Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ ÑолÑко в каÑеÑÑве ÑаблиÑÑ Ð² пÑедложении FROM.
ÐеобÑзаÑелÑное пÑедложение XMLNAMESPACES задаÑÑ ÑазделÑннÑй запÑÑÑми ÑпиÑок опÑеделений пÑоÑÑÑанÑÑв имÑн, в коÑоÑом uri_пÑоÑÑÑанÑÑва_имÑн â вÑÑажение Ñипа text, а имÑ_пÑоÑÑÑанÑÑва_имÑн â пÑоÑÑой иденÑиÑикаÑоÑ. РнÑм опÑеделÑÑÑÑÑ Ð¿ÑоÑÑÑанÑÑва имÑн XML, иÑполÑзÑемÑе в докÑменÑе, и иÑ
пÑевдонимÑ. ÐпÑеделение пÑоÑÑÑанÑÑва по ÑмолÑÐ°Ð½Ð¸Ñ Ð² наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ поддеÑживаеÑÑÑ.
РобÑзаÑелÑном аÑгÑменÑе вÑÑажение_ÑÑÑоки пеÑедаÑÑÑÑ Ð²ÑÑажение XPath 1.0 (в виде знаÑÐµÐ½Ð¸Ñ text), коÑоÑое бÑÐ´ÐµÑ Ð²ÑÑиÑлÑÑÑÑÑ Ð´Ð»Ñ XML-знаÑÐµÐ½Ð¸Ñ Ð²ÑÑажение_докÑменÑа, ÑлÑжаÑего ÑлеменÑом конÑекÑÑа, и вÑдаваÑÑ Ð½Ð°Ð±Ð¾Ñ Ñзлов XML. ÐÑи ÑÐ·Ð»Ñ xmltable пÑеобÑазÑÐµÑ Ð² вÑÑ
однÑе ÑÑÑоки. ÐÑли вÑÑажение_докÑменÑа â NULL, а Ñакже еÑли вÑÑажение_ÑÑÑоки вÑдаÑÑ Ð¿ÑÑÑой Ð½Ð°Ð±Ð¾Ñ Ñзлов или лÑбое знаÑение, оÑлиÑное Ð¾Ñ Ð½Ð°Ð±Ð¾Ñа Ñзлов, вÑÑ
однÑе ÑÑÑоки не вÑдаÑÑÑÑ.
ÐÑÑажение_докÑменÑа пеÑедаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ¾Ð½ÑекÑÑа Ð´Ð»Ñ Ð²ÑÑажениÑ_ÑÑÑоки. Таким ÑлеменÑом должен бÑÑÑ Ð¿ÑавилÑно оÑоÑмленнÑй XML-докÑменÑ; ÑÑагменÑÑ/набоÑÑ Ð´ÐµÑевÑев не допÑÑкаÑÑÑÑ. ÐÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ BY REF и BY VALUE пÑинимаÑÑÑÑ, но игноÑиÑÑÑÑÑÑ, о ÑÑм ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе D.3.2.
СоглаÑно ÑÑандаÑÑÑ SQL, ÑÑнкÑÐ¸Ñ xmltable должна вÑÑиÑлÑÑÑ Ð²ÑÑажениÑ, иÑполÑзÑÑ ÑÑедÑÑва ÑзÑка XML Query, но Postgres Pro воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑолÑко вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ XPath 1.0; подÑобнее об ÑÑом говоÑиÑÑÑ Ð² ÐодÑазделе D.3.1.
РобÑзаÑелÑном пÑедложении COLUMNS задаÑÑÑÑ ÑпиÑок ÑÑолбÑов Ð´Ð»Ñ Ð²ÑÑ
одной ÑаблиÑÑ. ФоÑÐ¼Ð°Ñ ÑÑого пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½ вÑÑе в опиÑании ÑинÑакÑиÑа. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа должно задаваÑÑÑÑ Ð¸Ð¼Ñ Ð¸ Ñип даннÑÑ
(еÑли ÑолÑко не Ñказано FOR ORDINALITY, ÑÑо подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ñип integer). ÐÑÑÑ, знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ пÑизнак допÑÑÑимоÑÑи NULL могÑÑ Ð¾Ð¿ÑÑкаÑÑÑÑ.
СÑÐ¾Ð»Ð±ÐµÑ Ñ Ð¿Ñизнаком FOR ORDINALITY бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑÑÑÑÑ Ð½Ð¾Ð¼ÐµÑами ÑÑÑок, наÑÐ¸Ð½Ð°Ñ Ñ 1, в Ñом поÑÑдке, в коÑоÑом ÑÑи ÑÑÑоки идÑÑ Ð² набоÑе Ñзлов, пÑедÑÑавлÑÑÑем ÑезÑлÑÑÐ°Ñ Ð²ÑÑажениÑ_ÑÑÑоки. ÐÑизнак FOR ORDINALITY Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ болÑÑе Ñем Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа.
ÐÑимеÑание
Ð XPath 1.0 не опÑеделÑн поÑÑдок Ñзлов в набоÑе, поÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð´, ÑаÑÑÑиÑÑваÑÑий на опÑеделÑннÑй поÑÑдок ÑезÑлÑÑаÑов, бÑÐ´ÐµÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑной ÑеализаÑии. ÐодÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе D.3.1.2.
РвÑÑажении_ÑÑолбÑа задаÑÑÑÑ Ð²ÑÑажение XPath 1.0, коÑоÑое вÑÑиÑлÑеÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки пÑимениÑелÑно к ÑекÑÑÐµÐ¼Ñ ÑзлÑ, полÑÑÐµÐ½Ð½Ð¾Ð¼Ñ Ð² ÑезÑлÑÑаÑе вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑÑажениÑ_ÑÑÑоки и ÑлÑжаÑÐµÐ¼Ñ ÑлеменÑом конÑекÑÑа, и вÑдаÑÑ Ð·Ð½Ð°Ñение ÑÑолбÑа. ÐÑли вÑÑажение_ÑÑолбÑа оÑÑÑÑÑÑвÑеÑ, в каÑеÑÑве неÑвного пÑÑи иÑполÑзÑеÑÑÑ Ð¸Ð¼Ñ ÑÑолбÑа.
ÐÑли вÑÑажение XPath возвÑаÑÐ°ÐµÑ Ð½Ðµ XML (ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑока, логиÑеÑкое или ÑиÑловое знаÑение в XPath 1.0) и ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð¼ÐµÐµÑ Ñип Postgres Pro, оÑлиÑнÑй Ð¾Ñ xml, знаÑение пÑиÑваиваеÑÑÑ ÑÑолбÑÑ Ñак же, как ÑÐ¸Ð¿Ñ Postgres Pro пÑиÑваиваеÑÑÑ ÑÑÑоковое пÑедÑÑавление знаÑениÑ. (ÐÑли ÑÑо знаÑение логиÑеÑкое, его ÑÑÑоковÑм пÑедÑÑавлением бÑÐ´ÐµÑ 1 или 0, еÑли Ñип ÑÑолбÑа оÑноÑиÑÑÑ Ðº ÑиÑловой каÑегоÑии, и true или false в пÑоÑивном ÑлÑÑае.)
ÐÑли заданное Ð´Ð»Ñ ÑÑолбÑа вÑÑажение XPath возвÑаÑÐ°ÐµÑ Ð½ÐµÐ¿ÑÑÑой Ð½Ð°Ð±Ð¾Ñ Ñзлов XML и ÑÑÐ¾Ñ ÑÑÐ¾Ð»Ð±ÐµÑ Ð² Postgres Pro Ð¸Ð¼ÐµÐµÑ Ñип xml, знаÑение ÐµÐ¼Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑиÑвоено как еÑÑÑ, когда оно Ð¸Ð¼ÐµÐµÑ ÑоÑÐ¼Ñ Ð´Ð¾ÐºÑменÑа или ÑодеÑжимого. [8]
Ðогда вÑÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ xml пÑиÑваиваеÑÑÑ Ð½Ðµ XML-ÑодеÑжимое, оно пÑедÑÑавлÑеÑÑÑ Ð² виде одного ÑекÑÑового Ñзла, ÑодеÑжаÑего ÑÑÑоковое знаÑение ÑезÑлÑÑаÑа. XML-ÑезÑлÑÑаÑ, пÑиÑваиваемÑй ÑÑолбÑÑ Ð»Ñбого дÑÑгого Ñипа, должен ÑоÑÑоÑÑÑ Ð½Ðµ более Ñем из одного Ñзла, инаÑе вÑдаÑÑÑÑ Ð¾Ñибка. ÐÑи налиÑии же Ñовно одного Ñзла ÑÑолбÑÑ, Ñ ÑÑÑÑом его Ñипа Postgres Pro, пÑиÑваиваеÑÑÑ ÑÑÑоковое пÑедÑÑавление ÑÑого Ñзла (полÑÑаемое по пÑавилам ÑÑнкÑии string в XPath 1.0).
СÑÑоковÑм знаÑением XML-ÑлеменÑа ÑвлÑеÑÑÑ ÐºÐ¾Ð½ÐºÐ°ÑенаÑÐ¸Ñ Ð²ÑеÑ
ÑекÑÑовÑÑ
Ñзлов, ÑодеÑжаÑиÑ
ÑÑ Ð² нÑм и во вложеннÑÑ
в него ÑлеменÑаÑ
, в поÑÑдке ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑиÑ
Ñзлов в докÑменÑе. СÑÑоковÑм знаÑением ÑлеменÑа без внÑÑÑенниÑ
ÑекÑÑовÑÑ
Ñзлов ÑвлÑеÑÑÑ Ð¿ÑÑÑÐ°Ñ ÑÑÑока (не NULL). ÐÑбÑе аÑÑибÑÑÑ Ñо ÑвойÑÑвами xsi:nil игноÑиÑÑÑÑÑÑ. ÐамеÑÑÑе, ÑÑо ÑоÑÑоÑÑий ÑолÑко из пÑобелÑнÑÑ
Ñимволов Ñзел text() Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð½ÐµÑекÑÑовÑми ÑлеменÑами пÑи ÑÑом ÑоÑ
ÑанÑеÑÑÑ, и наÑалÑнÑе пÑÐ¾Ð±ÐµÐ»Ñ Ð² Ñзле text() не ÑбиÑаÑÑÑÑ. ÐÑавила, опÑеделÑÑÑие ÑÑÑоковÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´ÑÑгиÑ
Ñипов XML-Ñзлов и не XML-знаÑений, можно найÑи в опиÑании ÑÑнкÑии string ÑзÑка XPath 1.0.
ÐÑедÑÑавленнÑе здеÑÑ Ð¿Ñавила пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ ÑооÑвеÑÑÑвÑÑÑ Ð² ÑоÑноÑÑи Ñем, ÑÑо опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² ÑÑандаÑÑе SQL, о ÑÑм ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе D.3.1.3.
Ðогда вÑÑажение пÑÑи возвÑаÑÐ°ÐµÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÑоки пÑÑÑой Ð½Ð°Ð±Ð¾Ñ Ñзлов (обÑÑно когда Ð½ÐµÑ ÑооÑвеÑÑÑÐ²Ð¸Ñ ÑÑÐ¾Ð¼Ñ Ð¿ÑÑи), ÑÑÐ¾Ð»Ð±ÐµÑ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð·Ð½Ð°Ñение NULL, еÑли ÑолÑко не задано вÑÑажение_по_ÑмолÑаниÑ. ÐÑли же оно задано, ÑÑÐ¾Ð»Ð±ÐµÑ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ вÑÑажениÑ.
Указанное вÑÑажение_по_ÑмолÑÐ°Ð½Ð¸Ñ Ð²ÑÑиÑлÑеÑÑÑ Ð½Ðµ ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ Ð´Ð»Ñ Ð²Ñзова ÑÑнкÑии xmltable, а каждÑй Ñаз, когда Ð´Ð»Ñ ÑÑолбÑа ÑÑебÑеÑÑÑ Ð¾ÑеÑедное знаÑение по ÑмолÑаниÑ. ÐÑли же ÑÑо вÑÑажение оказÑваеÑÑÑ ÑÑабилÑнÑм или поÑÑоÑннÑм, повÑоÑное вÑÑиÑление Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ вÑполнÑÑÑÑÑ. ÐÑо ознаÑаеÑ, ÑÑо в вÑÑажении_по_ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе Ñ Ð¿Ð¾Ð»Ñзой пÑименÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑивÑе ÑÑнкÑии, Ñакие как nextval.
СÑолбÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸Ð¼ÐµÑÑ Ð¿Ñизнак NOT NULL. ÐÑли вÑÑажение_ÑÑолбÑа Ð´Ð»Ñ ÑÑолбÑа Ñ Ð¿Ñизнаком NOT NULL не ÑооÑвеÑÑÑвÑÐµÑ Ð½Ð¸ÑÐµÐ¼Ñ Ð¸ пÑи ÑÑом оÑÑÑÑÑÑвÑÐµÑ Ñказание DEFAULT или вÑÑажение_по_ÑмолÑÐ°Ð½Ð¸Ñ Ñакже вÑдаÑÑ NULL, пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¾Ñибка.
ÐÑимеÑÑ:
CREATE TABLE xmldata AS SELECT
xml $$
<ROWS>
<ROW id="1">
<COUNTRY_ID>AU</COUNTRY_ID>
<COUNTRY_NAME>Australia</COUNTRY_NAME>
</ROW>
<ROW id="5">
<COUNTRY_ID>JP</COUNTRY_ID>
<COUNTRY_NAME>Japan</COUNTRY_NAME>
<PREMIER_NAME>Shinzo Abe</PREMIER_NAME>
<SIZE unit="sq_mi">145935</SIZE>
</ROW>
<ROW id="6">
<COUNTRY_ID>SG</COUNTRY_ID>
<COUNTRY_NAME>Singapore</COUNTRY_NAME>
<SIZE unit="sq_km">697</SIZE>
</ROW>
</ROWS>
$$ AS data;
SELECT xmltable.*
FROM xmldata,
XMLTABLE('//ROWS/ROW'
PASSING data
COLUMNS id int PATH '@id',
ordinality FOR ORDINALITY,
"COUNTRY_NAME" text,
country_id text PATH 'COUNTRY_ID',
size_sq_km float PATH 'SIZE[@unit = "sq_km"]',
size_other text PATH
'concat(SIZE[@unit!="sq_km"], " ", SIZE[@unit!="sq_km"]/@unit)',
premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified');
id | ordinality | COUNTRY_NAME | country_id | size_sq_km | size_other | premier_name
----+------------+--------------+------------+------------+--------------+---------------
1 | 1 | Australia | AU | | | not specified
5 | 2 | Japan | JP | | 145935 sq_mi | Shinzo Abe
6 | 3 | Singapore | SG | 697 | | not specified
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¸Ð»Ð»ÑÑÑÑиÑÑÐµÑ Ñложение неÑколÑÐºÐ¸Ñ Ñзлов text(), иÑполÑзование имени ÑÑолбÑа в каÑеÑÑве ÑилÑÑÑа XPath и обÑабоÑÐºÑ Ð¿ÑобелÑнÑÑ Ñимволов, XML-комменÑаÑиев и инÑÑÑÑкÑий обÑабоÑки:
CREATE TABLE xmlelements AS SELECT
xml $$
<root>
<element> Hello<!-- xyxxz -->2a2<?aaaaa?> <!--x--> bbb<x>xxx</x>CC </element>
</root>
$$ AS data;
SELECT xmltable.*
FROM xmlelements, XMLTABLE('/root' PASSING data COLUMNS element text);
element
-------------------------
Hello2a2 bbbxxxCC
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑ, как Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ XMLNAMESPACES можно задаÑÑ ÑпиÑок пÑоÑÑÑанÑÑв имÑн, иÑполÑзÑемÑÑ
в XML-докÑменÑе и в вÑÑажениÑÑ
XPath:
WITH xmldata(data) AS (VALUES ('
<example xmlns="http://example.com/myns" xmlns:B="http://example.com/b">
<item foo="1" B:bar="2"/>
<item foo="3" B:bar="4"/>
<item foo="4" B:bar="5"/>
</example>'::xml)
)
SELECT xmltable.*
FROM XMLTABLE(XMLNAMESPACES('http://example.com/myns' AS x,
'http://example.com/b' AS "B"),
'/x:example/x:item'
PASSING (SELECT data FROM xmldata)
COLUMNS foo int PATH '@foo',
bar int PATH '@B:bar');
foo | bar
-----+-----
1 | 2
3 | 4
4 | 5
(3 rows)
9.15.4. ÐÑобÑажение ÑÐ°Ð±Ð»Ð¸Ñ Ð² XML #
СледÑÑÑие ÑÑнкÑии оÑобÑажаÑÑ ÑодеÑжимое ÑелÑÑионнÑÑ ÑÐ°Ð±Ð»Ð¸Ñ Ð² знаÑÐµÐ½Ð¸Ñ XML. ÐÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑаÑÑмаÑÑиваÑÑ ÐºÐ°Ðº ÑÑедÑÑва ÑкÑпоÑÑа в XML:
table_to_xml(tableregclass,nullsboolean,tableforestboolean,targetnstext) âxmlquery_to_xml(querytext,nullsboolean,tableforestboolean,targetnstext) âxmlcursor_to_xml(cursorrefcursor,countinteger,nullsboolean,tableforestboolean,targetnstext) âxml
table_to_xml оÑобÑÐ°Ð¶Ð°ÐµÑ Ð² xml ÑодеÑжимое ÑаблиÑÑ, Ð¸Ð¼Ñ ÐºÐ¾ÑоÑой задаÑÑÑÑ Ð² паÑамеÑÑе table. Тип regclass пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ ÑÑÑок в обÑÑной запиÑи, коÑоÑÑе могÑÑ ÑодеÑжаÑÑ Ñказание ÑÑ
ÐµÐ¼Ñ Ð¸ кавÑÑки (за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.19). ФÑнкÑÐ¸Ñ query_to_xml вÑполнÑÐµÑ Ð·Ð°Ð¿ÑоÑ, ÑекÑÑ ÐºÐ¾ÑоÑого пеÑедаÑÑÑÑ Ð² паÑамеÑÑе query, и оÑобÑÐ°Ð¶Ð°ÐµÑ Ð² xml ÑезÑлÑÑиÑÑÑÑий набоÑ. ÐоÑледнÑÑ ÑÑнкÑиÑ, cursor_to_xml вÑбиÑÐ°ÐµÑ Ñказанное ÑиÑло ÑÑÑок из кÑÑÑоÑа, пеÑеданного в паÑамеÑÑе cursor. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ñ Ð±Ð¾Ð»ÑÑими ÑаблиÑами, Ñак как вÑе ÑÑи ÑÑнкÑии ÑоздаÑÑ ÑезÑлÑÑиÑÑÑÑий xml в памÑÑи.
ÐÑли паÑамеÑÑ tableforest Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение false, ÑезÑлÑÑиÑÑÑÑий XML-докÑÐ¼ÐµÐ½Ñ Ð²ÑглÑÐ´Ð¸Ñ Ñак:
<имÑ_ÑаблиÑÑ>
<row>
<имÑ_ÑÑолбÑа1> даннÑе </имÑ_ÑÑолбÑа1>
<имÑ_ÑÑолбÑа2> даннÑе </имÑ_ÑÑолбÑа2>
</row>
<row>
...
</row>
...
</имÑ_ÑаблиÑÑ>
РеÑли tableforest Ñавен true, в ÑезÑлÑÑаÑе бÑÐ´ÐµÑ Ð²Ñведен ÑледÑÑÑий ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ XML:
<имÑ_ÑаблиÑÑ> <имÑ_ÑÑолбÑа1> даннÑе </имÑ_ÑÑолбÑа1> <имÑ_ÑÑолбÑа2> даннÑе </имÑ_ÑÑолбÑа2> </имÑ_ÑаблиÑÑ> <имÑ_ÑаблиÑÑ> ... </имÑ_ÑаблиÑÑ> ...
ÐÑли Ð¸Ð¼Ñ ÑаблиÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑно, напÑимеÑ, пÑи оÑобÑажении ÑезÑлÑÑаÑов запÑоÑа или кÑÑÑоÑа, вмеÑÑо него в пеÑвом ÑлÑÑае вÑÑавлÑеÑÑÑ table, а во вÑоÑом â row.
ÐÑÐ±Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñ ÑÑими ÑоÑмаÑами оÑÑаÑÑÑÑ Ð·Ð° полÑзоваÑелем. ÐеÑвÑй ваÑÐ¸Ð°Ð½Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑоздаÑÑ Ð³Ð¾ÑовÑй XML-докÑменÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ
пÑиложений, а вÑоÑой Ñдобно пÑименÑÑÑ Ñ ÑÑнкÑией cursor_to_xml, еÑли ÐµÑ ÑезÑлÑÑаÑÑ Ð±ÑдÑÑ ÑобиÑаÑÑÑÑ Ð² докÑÐ¼ÐµÐ½Ñ Ð¿Ð¾Ð·Ð¶Ðµ. ÐолÑÑеннÑй ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ измениÑÑ Ð¿Ð¾ вкÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑаÑÑмоÑÑеннÑÑ
вÑÑе ÑÑнкÑий ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ XML-ÑодеÑжимого, в ÑаÑÑноÑÑи xmlelement.
ÐнаÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑÑи ÑÑнкÑии оÑобÑажаÑÑ Ñак же, как и Ñанее опиÑÐ°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ xmlelement.
ÐаÑамеÑÑ nulls опÑеделÑеÑ, нÑжно ли вклÑÑаÑÑ Ð² ÑезÑлÑÑÐ°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL. ÐÑли он ÑÑÑановлен, знаÑÐµÐ½Ð¸Ñ NULL в ÑÑолбÑаÑ
пÑедÑÑавлÑÑÑÑÑ Ñак:
<имÑ_ÑÑолбÑа xsi:nil="true"/>
ÐдеÑÑ xsi â пÑеÑÐ¸ÐºÑ Ð¿ÑоÑÑÑанÑÑва имÑн XML Schema Instance. ÐÑи ÑÑом в ÑезÑлÑÑиÑÑÑÑий XML бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ ÑооÑвеÑÑÑвÑÑÑее обÑÑвление пÑоÑÑÑанÑÑва имÑн. ÐÑли же даннÑй паÑамеÑÑ Ñавен false, ÑÑолбÑÑ Ñо знаÑениÑми NULL пÑоÑÑо не бÑдÑÑ Ð²ÑводиÑÑÑÑ.
ÐаÑамеÑÑ targetns опÑеделÑÐµÑ Ñелевое пÑоÑÑÑанÑÑво имÑн Ð´Ð»Ñ ÑезÑлÑÑиÑÑÑÑего XML. ÐÑли пÑоÑÑÑанÑÑво имÑн не нÑжно, знаÑением ÑÑого паÑамеÑÑа должна бÑÑÑ Ð¿ÑÑÑÐ°Ñ ÑÑÑока.
СледÑÑÑие ÑÑнкÑии вÑдаÑÑ Ð´Ð¾ÐºÑменÑÑ XML Schema, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ ÑÑ ÐµÐ¼Ñ Ð¾ÑобÑажений, вÑполнÑемÑÑ ÑооÑвеÑÑÑвÑÑÑими Ñанее ÑаÑÑмоÑÑеннÑми ÑÑнкÑиÑми:
table_to_xmlschema(tableregclass,nullsboolean,tableforestboolean,targetnstext) âxmlquery_to_xmlschema(querytext,nullsboolean,tableforestboolean,targetnstext) âxmlcursor_to_xmlschema(cursorrefcursor,nullsboolean,tableforestboolean,targetnstext) âxml
ЧÑÐ¾Ð±Ñ ÑезÑлÑÑаÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² XML ÑооÑвеÑÑÑвовали XML-ÑÑ ÐµÐ¼Ð°Ð¼, важно, ÑÑÐ¾Ð±Ñ ÑооÑвеÑÑÑвÑÑÑим ÑÑнкÑиÑм пеÑедавалиÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе паÑамеÑÑÑ.
СледÑÑÑие ÑÑнкÑии вÑдаÑÑ Ð¾ÑобÑажение даннÑÑ Ð² XML и ÑооÑвеÑÑÑвÑÑÑÑÑ XML-ÑÑ ÐµÐ¼Ñ Ð² одном докÑменÑе (или ÑÑагменÑе), обÑединÑÑ Ð¸Ñ Ð²Ð¼ÐµÑÑе. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ñам, где желаÑелÑно полÑÑиÑÑ ÑамодоÑÑаÑоÑнÑе ÑезÑлÑÑаÑÑ Ñ Ð¾Ð¿Ð¸Ñанием:
table_to_xml_and_xmlschema(tableregclass,nullsboolean,tableforestboolean,targetnstext) âxmlquery_to_xml_and_xmlschema(querytext,nullsboolean,tableforestboolean,targetnstext) âxml
Рдополнение к ним еÑÑÑ ÑледÑÑÑие ÑÑнкÑии, ÑпоÑобнÑе вÑдаÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑелÑÑ ÑÑ ÐµÐ¼ в базе даннÑÑ Ð¸Ð»Ð¸ даже Ð´Ð»Ñ Ð²Ñей ÑекÑÑей базÑ:
schema_to_xml(schemaname,nullsboolean,tableforestboolean,targetnstext) âxmlschema_to_xmlschema(schemaname,nullsboolean,tableforestboolean,targetnstext) âxmlschema_to_xml_and_xmlschema(schemaname,nullsboolean,tableforestboolean,targetnstext) âxmldatabase_to_xml(nullsboolean,tableforestboolean,targetnstext) âxmldatabase_to_xmlschema(nullsboolean,tableforestboolean,targetnstext) âxmldatabase_to_xml_and_xmlschema(nullsboolean,tableforestboolean,targetnstext) âxml
ÐÑи ÑÑнкÑии пÑопÑÑкаÑÑ ÑаблиÑÑ, коÑоÑÑе не Ð¼Ð¾Ð¶ÐµÑ ÑиÑаÑÑ ÑекÑÑий полÑзоваÑелÑ. ФÑнкÑии ÑÑÐ¾Ð²Ð½Ñ Ð±Ð°Ð·Ñ Ñакже пÑопÑÑкаÑÑ ÑÑ
емÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
ÑекÑÑий полÑзоваÑÐµÐ»Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð¿Ñава иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ (USAGE).
ÐамеÑÑÑе, ÑÑо обÑÑм ÑÐ°ÐºÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑим, а XML должен ÑÑоÑмиÑоваÑÑÑÑ Ð² памÑÑи. ÐоÑÑомÑ, вмеÑÑо Ñого ÑÑÐ¾Ð±Ñ Ð¿ÑÑаÑÑÑÑ Ð¾ÑобÑазиÑÑ Ð² XML ÑÑÐ°Ð·Ñ Ð²ÑÑ ÑодеÑжимое болÑÑÐ¸Ñ ÑÑ ÐµÐ¼ или баз даннÑÑ , лÑÑÑе делаÑÑ ÑÑо по ÑаблиÑам, возможно, даже иÑполÑзÑÑ ÐºÑÑÑоÑ.
РезÑлÑÑÐ°Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑодеÑжимого ÑÑ ÐµÐ¼Ñ Ð±ÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
<имÑ_ÑÑ ÐµÐ¼Ñ> оÑобÑажение-ÑаблиÑÑ1 оÑобÑажение-ÑаблиÑÑ2 ... </имÑ_ÑÑ ÐµÐ¼Ñ>
ФоÑÐ¼Ð°Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑаблиÑÑ Ð¾Ð¿ÑеделÑеÑÑÑ Ð¿Ð°ÑамеÑÑом tableforest, опиÑаннÑм вÑÑе.
РезÑлÑÑÐ°Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑодеÑжимого Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð±ÑÐ´ÐµÑ Ñаким:
<имÑ_ÐÐ> <имÑ_ÑÑ ÐµÐ¼Ñ1> ... </имÑ_ÑÑ ÐµÐ¼Ñ1> <имÑ_ÑÑ ÐµÐ¼Ñ2> ... </имÑ_ÑÑ ÐµÐ¼Ñ2> ... </имÑ_ÐÐ>
ÐдеÑÑ Ð¾ÑобÑажение ÑÑ ÐµÐ¼Ñ Ð¸Ð¼ÐµÐµÑ Ð²Ð¸Ð´, показаннÑй вÑÑе.
РкаÑеÑÑве пÑимеÑа, иллÑÑÑÑиÑÑÑÑего иÑполÑзование ÑезÑлÑÑаÑа ÑÑиÑ
ÑÑнкÑий, на ÐÑимеÑе 9.1 показано XSLT-пÑеобÑазование, коÑоÑое пеÑÐµÐ²Ð¾Ð´Ð¸Ñ ÑезÑлÑÑÐ°Ñ ÑÑнкÑии table_to_xml_and_xmlschema в HTML-докÑменÑ, ÑодеÑжаÑий ÑаблиÑÑ Ñ Ð´Ð°Ð½Ð½Ñми. ÐодобнÑм обÑазом ÑезÑлÑÑаÑÑ ÑÑиÑ
ÑÑнкÑий можно пÑеобÑазоваÑÑ Ð¸ в дÑÑгие ÑоÑмаÑÑ Ð½Ð° базе XML.
ÐÑÐ¸Ð¼ÐµÑ 9.1. XSLT-пÑеобÑазование, пеÑеводÑÑее ÑезÑлÑÑÐ°Ñ SQL/XML в ÑоÑÐ¼Ð°Ñ HTML
<?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>
[8] ÐÑимеÑом ÑоÑÐ¼Ñ ÑодеÑжимого ÑвлÑеÑÑÑ ÑезÑлÑÑаÑ, ÑодеÑжаÑий болÑÑе одного ÑлеменÑа-Ñзла на веÑÑ
нем ÑÑовне или какой-либо не пÑобелÑнÑй ÑекÑÑ Ð²Ð½Ðµ единÑÑвенного ÑлеменÑа. РезÑлÑÑÐ°Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ XPath Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¸ дÑÑгÑÑ ÑоÑмÑ, напÑимеÑ, еÑли оно вÑбиÑÐ°ÐµÑ Ñзел аÑÑибÑÑа из ÑодеÑжаÑего ÑÑÐ¾Ñ Ð°ÑÑибÑÑ ÑлеменÑа. Такой ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑиведÑн в ÑоÑÐ¼Ñ ÑодеÑжимого, в коÑоÑой каждÑй подобнÑй недопÑÑÑимÑй Ñзел заменÑеÑÑÑ ÑÑÑоковÑм пÑедÑÑавлением, полÑÑаемÑм по пÑавилам ÑÑнкÑии string в XPath 1.0.