Chương 9. Hàm và toán tử
9.14.3. Bảng ánh xạ tới XML
Các hàm sau đây ánh xạ các nội dung các bảng quan hệ tới các giá trị XML. Chúng có thể được nghĩ như là chức năng xuất 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)
Dạng trả về của từng hàm là xml.
table_to_xml ánh xạ nội dung của bảng có tên, truyền như tham số tbl. Dạng regclass chấp nhận các chuỗi xác định các bảng bằng việc sử dụng ký hiệu thông thường, bao gồm chất lượng sơ đồ tùy chọn và các dấu ngoặc kép, query_to_xml thực thi truy vấn mà văn bản của nó được truyền như tham số query và ánh xạ tập các kết quả. cursor_to_xml đem đến số các hàng được đánh chỉ số từ con trỏ được tham số cursor chỉ định. Phương án này được khuyến cáo nếu các bảng lớn phải được ánh xạ, vì giá trị kết quả được xây dựng trong bộ nhớ từ từng hàm.
Nếu tableforest là sai (false), thì tài liệu XML kết quả trông như thế này:
<tablename>
<row>
<columnname1>data</columnname1>
<columnname2>data</columnname2>
</row>
<row>
...</row>
...
</tablename>
Nếu là đúng, thì kết quả là một phân mảnh nội dung XML mà trông như thế này:
<tablename>
<columnname1>data</columnname1>
<columnname2>data</columnname2>
</tablename>
<tablename>
...
</tablename>
...
Nếu không tên bảng nào là sẵn sàng, đó là, khi việc ánh xạ một truy vấn hoặc một con trỏ, chuỗi
table được sử dụng trong định dạng trước, còn row trong định dạng thứ 2.
Sự lựa chọn giữa các định dạng đó phụ thuộc vào người sử dụng. Định dạng đầu tiên là một tài liệu
XML phù hợp, nó sẽ là quan trọng trong nhiều ứng dụng. Định dạng thứ 2 có xu hướng sẽ là hữu dụng hơn trong hàm cursor_to_xml nếu các giá trị kết quả sẽ được tập hợp lại trong tài liệu sau đó.
Các hàm cho việc tạo ra nội dung XML được thảo luận ở trên, đặc biệt xmlelement, có thể được sử dụng để tùy biến các kết quả theo ý muốn.
Các giá trị dữ liệu được ánh xạ theo cách thức y hệt như được mô tả cho hàm xmlelement ở trên.
tham số nulls xác định liệu các giá trị null có nên được đưa vào ở đầu ra hay không. Nếu đúng, thì các giá trị null trong các cột được thể hiện như:
<columnname xsi:nil="true"/>
trong đó xsi là tiền tố không gian tên XML cho trường hợp Sơ đồ XML. Một khai báo không gian tên phù hợp sẽ được thêm vào giá trị kết quả. Nếu sai, các cột có chứa các giá trị null đơn giản sẽ bị mờ khỏi đầu ra.
Tham số targetns chỉ định không gian tên XML mong muốn của kết quả. Nếu không có không gian tên nào đặc biệt mong muốn, thì một chuỗi rỗng sẽ được truyền.
Các hàm sau trả về các tài liệu Sơ đồ XML, mô tả việc ánh xạ được các hàm tương ứng ở trên thực hiện:
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)
Là cơ bản rằng các tham số y hệt được truyền để giành được việc khớp các ánh xạ dữ liệu XML và các tài liệu Sơ đồ XML.
Các hàm sau tạo ra các ánh xạ dữ liệu XML và Sơ đồ XML tương ứng trong một tài liệu (hoặc rừng), được liên kết với nhau. Chúng có thể là hữu dụng ở những nơi các kết quả khép kín và tự mô tả được mong muốn:
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)
Hơn nữa, các hàm sau là sẵn sàng để tạo ra các ánh xạ tương tự của toàn bộ các sơ đồ hoặc toàn bộ cơ sở dữ liệu hiện hành:
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)
Lưu ý rằng các ánh xạ nội dung của các sơ đồ và cơ sở dữ liệu lớn, có thể đáng để xem xét việc ánh xạ các bảng một cách tách bạch thay vào đó, thậm chí có thể thông qua một con trỏ.
Kết quả của một ánh xạ nội dung sơ đồ trông giống như thế này:
<schemaname>
table1-mapping table2-mapping
...
</schemaname>
trong đó định dạng một ánh xạ bảng phụ thuộc vào tham số rừng bảng như được giải thích ở trên.
Kết quả của một ánh xạ nội dung cơ sở dữ liệu trông giống thế này:
<dbname>
<schema1name>
...
</schema1name>
<schema2name>
...
</schema2name>
...
</dbname>
trong đó ánh xạ sơ đồ là như ở trên.
Như một ví dụ sử dụng đầu ra được các hàm đó tạo ra, Hình 9-1 chỉ một bảng kiểu XSLT mà biến đổi đầu ra của table_to_xml_and_xmlschema thành một tài liệu HTML có chứa một sự trả về dạng bảng các dữ liệu bảng đó. Theo cách thức tương tự, các kết quả từ các hàm đó có thể được biến đổi thành các định dạng khác dựa vào XML.
Hình 9-1. Bảng XSLT cho việc biến đổi đầu ra SQL/XML thành 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:<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/
<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>