?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
在本節(jié)描述的函數(shù)和像函數(shù)的表達(dá)式都是操作基于xml類型的值。
查看Section 8.13獲取關(guān)于xml類型的信息。
像函數(shù)表達(dá)式的xmlparse
和xmlserialize
用來轉(zhuǎn)換為和從類型xml轉(zhuǎn)換不在這里重復(fù)。使用這些函數(shù)需要在構(gòu)建命令
configure --with-libxml安裝。
一組函數(shù)和像函數(shù)的表達(dá)式可用于從SQL數(shù)據(jù)生成XML內(nèi)容。 所以它們特別適合于查詢結(jié)果格式化成 在客戶端應(yīng)用程序處理的XML文件。
xmlcomment
(text)
xmlcomment
函數(shù)創(chuàng)建一個包含XML注釋的特定文本內(nèi)容的值。文本中不能包含"--"
或"-"的結(jié)束,這樣的文本是有效的XML注釋。如果參數(shù)是空,結(jié)果是空。
Example:
SELECT xmlcomment('hello'); xmlcomment -------------- <!--hello-->
xmlconcat
(xml[, ...])
函數(shù)xmlconcat
連接一個獨(dú)立的XML值列表來創(chuàng)建一個包含XML內(nèi)容片段的單值。
忽略空值;只有當(dāng)參數(shù)都為空時結(jié)果是空。
示例:
SELECT xmlconcat('<abc/>', '<bar>foo</bar>'); xmlconcat ---------------------- <abc/><bar>foo</bar>
XML聲明,如果存在,結(jié)合如下。如果所有參數(shù)使用相同的XML版本聲明,則在結(jié)果是使用版本。否則不用版本。 如果所有的參數(shù)值有獨(dú)立的聲明值,然后這個值在結(jié)果里使用。如果所有的參數(shù)值有獨(dú)立的聲明,并且至少有一個是"沒有的", 然后這個值在結(jié)果里使用。否則結(jié)果將沒有獨(dú)立聲明。如果結(jié)果決定需要一個獨(dú)立的聲明,但沒有聲明版本,將使用一個帶有版本1.0的版本聲明, 因為XML需要一個XML聲明包含版本聲明。忽略編碼聲明,在所有情況下刪除。
Example:
SELECT xmlconcat('<?xml version="1.1"?><foo/>', '<?xml version="1.1" standalone="no"?><bar/>'); xmlconcat ----------------------------------- <?xml version="1.1"?><foo/><bar/>
xmlelement
(namename[, xmlattributes(value[ASattname][, ...])][, content, ...])
xmlelement
表達(dá)式生成 一個帶有給定名稱,屬性和內(nèi)容的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>
不合法的元素和屬性名由逃逸序列_xHHHH_替換有問題的字符, 這里的HHHH是字符Unicode編碼值的16進(jìn)制表示。例如:
SELECT xmlelement(name "foo$bar", xmlattributes('xyz' as "a&b")); xmlelement ---------------------------------- <foo_x0024_bar a_x0026_b="xyz"/>
需要一個明確的屬性名稱,如果屬性值是一個列引用則不用指定, 在這種情況下,列的名稱將默認(rèn)為屬性名。 在其它情況下,屬性必須給予一個明確的名稱。 因此,這個例子是有效:
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;
元素內(nèi)容,如果指定,將格式化相應(yīng)的數(shù)據(jù)類型。如果內(nèi)容自身是xml類型, 可以構(gòu)造復(fù)雜的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>
將其它類型的內(nèi)容格式化為有效的xml字符串?dāng)?shù)據(jù)。這意味著特殊字符 <, >, and &將轉(zhuǎn)化為一般符號。將二進(jìn)制數(shù)據(jù)(bytea數(shù)據(jù)類型用base64或16進(jìn)值編碼表示,根據(jù) 配置參數(shù)xmlbinary的設(shè)置。單個數(shù)據(jù)類型的特定行為,預(yù)計演變以對齊與 XML 架構(gòu)規(guī)范, 在哪個點的更準(zhǔn)確描述將出現(xiàn) SQL 和 PostgreSQL 的數(shù)據(jù)類型。
xmlforest
(content[ASname][, ...])
xmlforest
表達(dá)式生成一個 XML 森林使用指定的名稱和內(nèi)容元素的序列。
示例:
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> ...
在第二個例子可以看出,如果內(nèi)容值為列引用,元素名稱可以省略。在這種情況下,默認(rèn)使用列名。否則,必須指定名稱。
非法XML名的元素名稱,像上面的xmlelement
逃逸處理。類似內(nèi)容數(shù)據(jù)逃逸生成有效的XML內(nèi)容,
除非它已經(jīng)是xml類型的。
請注意,如果組成一個以上的元素,XML的森林不是有效的XML文檔,所以在xmlelement
封裝
xmlforest
表達(dá)式可能是有用的。
xmlpi
(nametarget[,content])
xmlpi
表達(dá)式創(chuàng)建一條XML處理指令。
如果存在,內(nèi)容必須不能包含字符序列?>。
示例:
SELECT xmlpi(name php, 'echo "hello world";'); xmlpi ----------------------------- <?php echo "hello world";?>
xmlroot
(xml, versiontext| no value[, standalone yes|no|no value])
xmlroot
表示更改根節(jié)點屬性的XML值。如果指定一個版本,
它替換根節(jié)點的版本聲明值;如果指定一個standalone設(shè)置,它替換根節(jié)點的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>
xmlagg
(xml)
函數(shù)xmlagg
,不像其它這里描述的函數(shù),聚合函數(shù)。它連接聚合函數(shù)調(diào)用的輸入值,
很像xmlconcat
,除了串聯(lián)發(fā)生跨行,而不是單行中跨表達(dá)式。請參閱Section 9.18
獲取關(guān)于聚合函數(shù)的更多信息。
示例:
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子句要添加到聚合調(diào)用,描述在Section 4.2.7。 示例:
SELECT xmlagg(x ORDER BY y DESC) FROM test; xmlagg ---------------------- <bar/><foo>abc</foo>
建議在之前的版本中使用下面非標(biāo)準(zhǔn)的方法,在特例中可能仍然有用:
SELECT xmlagg(x) FROM (SELECT * FROM test ORDER BY y DESC) AS tab; xmlagg ---------------------- <bar/><foo>abc</foo>
xmlIS DOCUMENT
表達(dá)式IS DOCUMENT如果參數(shù)XML值是一個合法的XML文檔,返回真。否則返回假(例如,內(nèi)容片段)或如果參數(shù)為空則返回空。 請參閱Section 8.13關(guān)于文檔和內(nèi)容片段之間的不同。
PostgreSQL提供了xpath
函數(shù)處理xml數(shù)據(jù)類型的值。
計算XPath 1.0表達(dá)式的結(jié)果。
xpath
(xpath,xml[,nsarray])
xpath
函數(shù),對xmlXML值計算xpathXPath表達(dá)式的結(jié)果。
它返回一個XML值的數(shù)組對應(yīng)XPath表達(dá)式所產(chǎn)生的節(jié)點集。
第二個參數(shù)必須是一個完整的XML文檔。特別是,它必須有一個根節(jié)點元素。
該函數(shù)的第三個參數(shù)是一個命名空間的數(shù)組映射。這個數(shù)組應(yīng)該是一個兩維數(shù)組,
第二個軸的長度等于2(它應(yīng)該是一個數(shù)組的數(shù)組,其中每個包含完全2個元素)。
每個數(shù)組項的第一個元素是命名空間名稱的別名,第二個命名空間 URI。
這個數(shù)組的別名不是必須提供的,與在XML文檔本身使用的相同。(換句話說,在XML文檔和在的XPath
函數(shù)的上下文中,別名是local)。
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)
How to deal with default (anonymous) namespaces:
SELECT xpath('//mydefns:b/text()', '<a xmlns="http://example.com"><b>test</b></a>', ARRAY[ARRAY['mydefns', 'http://example.com']]); xpath -------- {test} (1 row)
下面的函數(shù)映射關(guān)系表的內(nèi)容為XML值??梢詫⑺鼈冋J(rèn)作為XML導(dǎo)出功能:
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)
每個函數(shù)的返回類型是xml。
table_to_xml
映射命名表的內(nèi)容,傳遞參數(shù)tbl。
regclass類型接受使用常用符號的字符串標(biāo)識表,包括可選的模式(schema)結(jié)構(gòu)和雙引號。
query_to_xml
執(zhí)行傳遞的文本query參數(shù)查詢,并映射結(jié)果集。
cursor_to_xml
從cursor的游標(biāo)中獲取指定數(shù)量的行。如果大數(shù)據(jù)表映射,建議使用這個函數(shù),
因為每個函數(shù)的結(jié)果值在內(nèi)存中構(gòu)建的。
如果tableforest是假值, 則結(jié)果的XML文檔像這樣:
<tablename> <row> <columnname1>data</columnname1> <columnname2>data</columnname2> </row> <row> ... </row> ... </tablename>
如果tableforest是真值, 結(jié)果是一個XML內(nèi)容片段像這樣:
<tablename> <columnname1>data</columnname1> <columnname2>data</columnname2> </tablename> <tablename> ... </tablename> ...
如果沒有可用的表名,那是在映射一個查詢或游標(biāo),第一個格式用字符串table,第二個格式用row。
這些格式給用戶選擇使用的。第一個格式是適當(dāng)?shù)腦ML文檔,在許多應(yīng)用程序中比較重要的。
在cursor_to_xml
函數(shù),如果結(jié)果值是稍后重新組合成一個文件,則第二種格式往往更為有用。
這些函數(shù)用來產(chǎn)生上述討論的XML內(nèi)容,特別在xmlelement
里,嘗試更改的結(jié)果。
映射的數(shù)據(jù)值與XMLELEMENT
以上所述相同的方式。
參數(shù)nulls取決于在輸出是否包含空值。 如果真, 列中的空值表示為:
<columnname xsi:nil="true"/>
這里的xsi是XML架構(gòu)實例的XML命名空間前綴。 為結(jié)果值添加一個適當(dāng)?shù)拿臻g聲明。 如果假, 從輸出的列包含空值只是簡單的省略。
參數(shù)的targetns>指定想要結(jié)果的XML命名空間。如果沒有特別想要的命名空間,應(yīng)傳遞一個空字符串。
下面的函數(shù)返回描述由上述相應(yīng)的函數(shù)執(zhí)行映射的 XML 架構(gòu)文檔:
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)
它是傳遞基本相同的參數(shù)以獲取匹配的XML數(shù)據(jù)映射和XML架構(gòu)文檔。
下列函數(shù)生成XML數(shù)據(jù)映射和相應(yīng)的XML架構(gòu)一個文檔或森林中,聯(lián)系在一起。 它們可能很有用,想自我包含和描述的結(jié)果:
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)
此外,下列函數(shù)還可用于生成類似映射的整個模式或整個當(dāng)前數(shù)據(jù)庫:
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)
請注意這些可能產(chǎn)生大量的數(shù)據(jù),需要在內(nèi)存中建立的。當(dāng)請求大數(shù)據(jù)量的模式或數(shù)據(jù)庫的內(nèi)容映射時, 它可能值得考慮映射表分別替代,可能甚至通過游標(biāo)。
一個模式內(nèi)容映射的結(jié)果像這樣:
<schemaname> table1-mapping table2-mapping ... </schemaname>
其中一個表映射的格式取決于如上面所述的tableforest參數(shù)。
一個數(shù)據(jù)庫內(nèi)容映射的結(jié)果像這樣:
<dbname> <schema1name> ... </schema1name> <schema2name> ... </schema2name> ... </dbname>
模式映射如上所述。
使用這些函數(shù)產(chǎn)生的輸出作為例子,F(xiàn)igure 9-1顯示一個XSLT樣式表轉(zhuǎn)換
table_to_xml_and_xmlschema
到HTML的輸出,該文當(dāng)中包含了一個表格再現(xiàn)表數(shù)據(jù)。
以類似的方式,可以從這些函數(shù)轉(zhuǎn)換成其它基于XML格式的結(jié)果。
Figure 9-1. XSLT樣式表--將SQL/XML轉(zhuǎn)換成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="http://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>