Introduction ============ Tabular is a PHP library for generating table data structures (e.g. an invoice, a report) from an XML data source using expressions, self-reference and more. It allows you to: - Define a configuration which dynamically creates table *rows* composed of *cells*. - Evaluate values dynamically using *extended* XPath expressions. - Use tokens in expressions, literal values and cell names, and iterate over sets of *items*. - Assign rows (or sets of rows) to groups, which can be targeted in subsequent passes. - Format cells using pre-configured and custom formatters. - Define parameters which can be passed at the time of generation. It accepts a source XML document and a Tabular JSON definition file, it gives back an XML file structured as a table which can then be used in anyway you would like. Why? ---- You could generate complex tabular data only with PHP, but beyond a certain threshold this results in a nightmare of variables and spaghetti code. You could do generate reports with XSLT transformations, but I think this is hugely verbose and detached from the familiar PHP environment. How? ---- The central concept is the definition file: .. code-block:: javascript { "rows": [ { "cells": [ { "name": "title", "expr": "string(./title)" }, { "name": "price", "expr": "number(./price)" } ], "with_query": "//book" }, { "cells": [ { "name": "price", "expr": "sum(//price)" } ] } ] } The above definition will generate a table representation in XML with a row for each `` element in the given XML file and provide an additional row showing the sum of all the `` elements of the `` element. So given the following XML file: .. code-block:: xml War and Peace 5.00 One Hundered Years of Soliture 7 The generated table might look like this (as rendered by the Tabular CLI):: ┌────────────────────────────────┬───────┐ │ title │ price │ ├────────────────────────────────┼───────┤ │ War and Peace │ 5 │ │ One Hundered Years of Soliture │ 7 │ │ │ 12 │ └────────────────────────────────┴───────┘ The necessary code is as follows: .. code-block:: php load('books.xml'); // report.json contains the above JSON definition $tableDom = Tabular::getInstance()->tabulate($dom, 'report.json'); ```` We can then either iterate the table data with an XPath query: .. code-block:: php foreach ($tableDom->xpath()->query('//row') as $rowEl) { foreach ($tableDom->xpath()->query('.//cell', $rowEl) as $cellEl) { $value = $cellEl->nodeValue; } } or dump it as an array .. code-block:: php toArray();