dataschema-table.mustache revision 819e90d415ed17d59af3a247b2ad9d6feb0c21b5
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly<div class="intro">
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly <p>DataSchema.XML can be used to retrieve data held in HTML TABLE elements.</p>
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly</div>
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
819e90d415ed17d59af3a247b2ad9d6feb0c21b5Luke Smith<div class="example yui3-skin-sam">
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly {{>dataschema-table-source}}
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly</div>
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly<p>DataSource.XML's `apply()` method supports passing in DOM nodes or document fragments. Use XPath strings to define data locations. In this example, we are retrieving data held in the rows of a TABLE element.</p>
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly```
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny DonnellyYUI().use("dataschema-xml", function(Y) {
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly var tableEl = Y.Node.getDOMNode(Y.one("#simple")),
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly schema = {
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Each record is held in a TR
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly resultListLocator: "tr",
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Note that the XPath indexes are 1-based!
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly resultFields: [
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly {key:"beverage", locator:"td[1]"},
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly {key:"price", locator:"td[2]"}
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly ]
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly },
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly data_out = Y.DataSchema.XML.apply(schema, tableEl));
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly alert(data_out);
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly});
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly```
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly<p>If the table has a THEAD element and/or multiple TBODY elements, special considerations must be taken to apply the schema to the appropriate collection of TR elements. In the following complex example we leverage the power of the Node API to</p>
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly<ul>
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly <li>Access the contents of the THEAD to generate our schema dynamically;</li>
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly <li>and access only the TR elements contained in TBODY elements for data values, ignoring those TR elements in the THEAD.</li>
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly</ul>
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly```
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny DonnellyYUI().use("dataschema-xml", function(Y) {
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // This function generates a schema based on contents of a TABLE element
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly var getSchemaFromTableNode = function(tableNode) {
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly var fields = [],
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Each record is held in a TR
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly schema = {resultListLocator:"tr"},
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Each field name is held in a TH
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly thList = tableNode.all("th");
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Generate field definitions based on TH
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly thList.each(function(thNode, i){
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Note that the XPath indexes are 1-based!
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly fields.push({key:thNode.get("text"), locator:"td["+(i+1)+"]"});
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly });
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly schema.resultFields = fields;
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly return schema;
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly };
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly var tableNode = Y.one("#complex"),
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Generate schema dynamically
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly schema = getSchemaFromTableNode(tableNode),
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Create a temporary TBODY container to hold all data TRs
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly tbody = document.createElement("tbody"),
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly tbodyContainer = document.createDocumentFragment().appendChild(tbody);
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Grab each TR in a TBODY but don't include TRs from the THEAD
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly Y.all("#complex tbody tr").each(function(trNode, i){
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Cloning the TR keeps it in the document (optional)
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly // Append each TR to the container
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly tbodyContainer.appendChild(Y.Node.getDOMNode(trNode).cloneNode(true));
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly })
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly var data_out = Y.DataSchema.XML.apply(schema, tbodyContainer));
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly alert(data_out);
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly});
8f9d94fb7812612dff92ce14a37dbcad4ff02c1cJenny Donnelly```