1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
<!--
-
- This file is part of the OpenLink Software Virtuoso Open-Source (VOS)
- project.
-
- Copyright (C) 1998-2006 OpenLink Software
-
- This project is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; only version 2 of the License, dated June 1991.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-
-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<refentry id="MS-A-2">
<refmeta>
<refentrytitle>Using Annotated XSD Schemas for Creating XML Views</refentrytitle>
<refmiscinfo>tutorial</refmiscinfo>
</refmeta>
<refnamediv>
<refname></refname>
<refpurpose>Using sql:relation and sql:field</refpurpose>
</refnamediv>
<refsect1 id="MS-A-2a">
<title>Preliminaries</title>
<para>
The sql:relation annotation maps an XML node in the XSD schema to a database table.
The name of a table (view) is specified as the value of the sql:relation annotation.
When sql:relation is specified on an element, the scope of this annotation applies to all attributes and
subelements that are described in the complex type definition of that element, therefore, providing a shortcut
in writing annotations.
The sql:relation annotation also may be used if identifiers that are valid in SQL
are not valid in XML. For example, 'Order Details' is a valid table name in SQL, but not in XML.
In such cases, the sql:relation annotation can be used to specify the mapping, for example:
<xsd:element name="OrderDetails" sql:relation="Order Details">
...
The sql:field annotation maps an XML node in the schema to a database column. It's not allowed to specify
sql:field on an empty content element.
</para>
</refsect1>
<refsect1 id="MS-A-2b">
<title>Example</title>
<para>
In this example, the XSD schema consists of an 'Emp' element of complex type with 'FirstName',
'LastName' and 'title' child elements and the 'EmpID' attribute.
The sql:relation annotation maps the 'Emp' element to the Demo.demo.Employees table. The sql:field
annotation maps the 'title' element to the 'Title' column and the 'EmpID' attribute
to the "EmployeeID" column.
No annotations are specified for the 'FirstName' and 'LastName' elements. This results in a
default mapping of the elements to the columns with the same names.
</para>
<programlisting><![CDATA[
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Emp" sql:relation="Demo.demo.Employees" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="FirstName"
type="xsd:string" />
<xsd:element name="LastName"
type="xsd:string" />
<xsd:element name="title"
sql:field="Title"
type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="EmpID" sql:field="EmployeeID" type="xsd:integer" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
]]></programlisting>
<para>Let the schema is written to the file 'EmpSchema.xsd', then after loading this file by
<function>xml_load_mapping_schema_decl</function> function, the first example will produce a result for the XPath query:
</para>
<programlisting><![CDATA[
XPATH [__view 'EmpSchema'] /*
]]></programlisting>
the second example will produce a result for the XQuery query:
<programlisting><![CDATA[
select xquery_eval('<doc>{for $r in xmlview("EmpSchema")/* return $r}</doc>', xtree_doc('<q/>'));
]]></programlisting>
<para>
<doc> is necessary for serialization (any name instead 'doc' is possible)
</para>
</refsect1>
</refentry>
|