15.3.7. Mapping Schemas as XML Views
Virtuoso supports creating XML views by using annotated XSD
schemas referred to as mapping schemas.
A file containing a mapping schema may be loaded by calling the
xml_load_mapping_schema_decl()
function. A name (without extension .xsd) of the file containing a mapping schema
is considered to be the name of the xml view, defined by the given mapping schema.
A loaded mapping schema may be queried in the same way as one would query XML views defined using the CREATE XML VIEW statement with XPATH:
XPATH [__view "xml_view_name"]/xpath_query
Example 15.11. Loading and Querying a Mapping Schema
The XML view "Catmp" from the file "Catmp.xsd" may be loaded using the following statement:
select xml_load_mapping_schema_decl ( 'http://localhost.localdomain/xmlrepository/', 'Catmp.xsd', 'UTF-8', 'x-any' ) ) );
where the contents of "Catmp.xsd" is
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> <xsd:annotation> <xsd:appinfo> <sql:relationship name="CategoryProduct" parent="Demo.demo.Categories" parent-key="CategoryID" child="Demo.demo.Products" child-key="CategoryID" /> </xsd:appinfo> </xsd:annotation> <xsd:element name="category" sql:relation="Demo.demo.Categories" type="CategoryType" /> <xsd:complexType name="CategoryType" > <xsd:sequence> <xsd:element name="product" sql:relation="Demo.demo.Products" sql:relationship="CategoryProduct" > <xsd:complexType> <xsd:attribute name="ProductName" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="CategoryID" type="xsd:integer" /> <xsd:attribute name="description" sql:field="Description" type="xsd:string" /> </xsd:complexType> </xsd:schema>
The XML view "Catmp" loaded from the file "Catmp.xsd" is similar to XML view "cat" defined by CREATE XML VIEW in the section Explicit Xml Views .
The query
XPATH [__view 'Catmp'] /category[@* = 1];
will now return the following result:
<category CategoryID="1" description="Soft drinks, coffees, teas, beers, and ales" > <product ProductName="Chai" ></product> <product ProductName="Chang" ></product> <product ProductName="Guarana Fantastica" ></product> <product ProductName="Sasquatch Ale" ></product> <product ProductName="Steeleye Stout" ></product> <product ProductName="Cote de Blaye" ></product> <product ProductName="Chartreuse verte" ></product> <product ProductName="Ipoh Coffee" ></product> <product ProductName="Laughing Lumberjack Lager" ></product> <product ProductName="Outback Lager" ></product> <product ProductName="Rhonbrau Klosterbier" ></product> <product ProductName="Lakkalikoori" ></product> </category>
Mapping schemas provide more flexibility than XML views defined by
the CREATE XML VIEW
statement.
In the following mapping schema a constant element, "CustomerOrders", an
element that does not map to any database table or column but may appear in the
resulting XML as a container element of other subelements, is specified
by the sql:is-constant
annotation.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> <xsd:annotation> <xsd:appinfo> <sql:relationship name="CustOrders" parent="Demo.demo.Customers" parent-key="CustomerID" child="Demo.demo.Orders" child-key="CustomerID" /> </xsd:appinfo> </xsd:annotation> <xsd:element name="Customer" sql:relation="Demo.demo.Customers" > <xsd:complexType> <xsd:sequence> <xsd:element name="CustomerOrders" sql:is-constant="1" > <xsd:complexType> <xsd:sequence> <xsd:element name="Order" sql:relation="Demo.demo.Orders" sql:relationship="CustOrders" maxOccurs="unbounded" > <xsd:complexType> <xsd:attribute name="OrderID" type="xsd:integer" /> <xsd:attribute name="OrderDate" type="xsd:date" /> <xsd:attribute name="CustomerID" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="CustomerID" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:schema>
After loading the "Cust_constant.xsd" file containing the given mapping schema, the xpath query:
XPATH [__view 'Cust_constant'] /category[@* = 1];
will return the following result:
<Customer CustomerID="ALFKI" > <CustomerOrders > <Order CustomerID="ALFKI" OrderDate="1995-09-25 00:00:00.000000" OrderID="10643" ></Order> <Order CustomerID="ALFKI" OrderDate="1995-11-03 00:00:00.000000" OrderID="10692" ></Order> <Order CustomerID="ALFKI" OrderDate="1995-11-13 00:00:00.000000" OrderID="10702" ></Order> <Order CustomerID="ALFKI" OrderDate="1996-02-15 00:00:00.000000" OrderID="10835" ></Order> <Order CustomerID="ALFKI" OrderDate="1996-04-15 00:00:00.000000" OrderID="10952" ></Order> <Order CustomerID="ALFKI" OrderDate="1996-05-09 00:00:00.000000" OrderID="11011" ></Order> </CustomerOrders> </Customer> . . .
Virtuoso does not support all mapping schema annotations at this time. The following are currently unsupported:
sql:encode
|
sql:use-cdata
|
sql:overflow-field
|
sql:inverse
|
sql:hide
|
sql:guid
|
sql:max-depth
|
Also, there are some restrictions to the structure of mapping schemas:
Attributes can not contain sql:relationship annotation. |
Subelement having no sql:is-constant annotation and not mapped to any table can not contain subelements and attributes. |
Recursive relationships is not supported. |
Note: | |
---|---|
The XML views, defined by mapping schemas may not be queried using XQUERY. They can however be referenced with the xmlview XPATH functions in path expressions inside an XQuery query. |
See Also: | |
---|---|
SQLXML 3.0 documentation: Creating XML Views by Using Annotated XSD Schemas. |