XSLT
You can use XSLT to transform the XML result of a report into a new output format.
The following section shows some examples how to transform and aggregate the XML result of an Imixs EntityCollection into new formats using XSLT.
Select a single Item Value
The following example shows an output of item values of the current document:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> Status:<xsl:value-of select="document/item[@name='$workflowstatus']/value" /> Supplier:<xsl:value-of select="document/item[@name='_supplier']/value" /> </xsl:template> </xsl:stylesheet>
Select an Item List
Items can contain a value list. The following example shows how to iterate over a list of values stored in the item named ‘_system’:
... <xsl:for-each select="document/item[@name='_system']/value"> <xsl:value-of select="." /> </xsl:for-each> ....
Iterate over a List of embedded Items
The following example shows how you can iterate over a embedded list of items (Map) stored in an item with the name ‘_childitems’ :
... <xsl:for-each select="document/item[@name='_childitems']/value"> <tr> <td><xsl:value-of select="item[@name='numpos']/value"/></td> <td><xsl:value-of select="item[@name='article']/value"/></td> <td><xsl:value-of select="item[@name='amount']/value"/></td> <td><xsl:value-of select="item[@name='unit']/value"/></td> <td><xsl:value-of select="item[@name='price']/value"/></td> </tr> </xsl:for-each> ...
Select Entities by a Specific Item Value
The following Example shows how to select only entities with the specific Item $workflowgroup=‘Invoice’ and print out the attribute ‘$tworkflowstatus’ of each matching entity:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <collection> <xsl:apply-templates select="/collection/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Rechnungsausgang']" /> </collection> </xsl:template> <!-- Template Definition --> <xsl:template match="/collection/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Rechnungsausgang']"> Status=<xsl:value-of select="item[@name='$workflowstatus']/value" /> </xsl:template> </xsl:stylesheet>
Group Workitems by Category
You can also group entities by a Item Value. The next example groups all entities by the Item “$workflowstatus” and print out the attributes $created and _amount in each category
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:key name="groups" match="/collection/document" use="item[@name='$workflowstatus']/value" /> <xsl:template match="/"> <collection> <xsl:apply-templates select="/collection/document[generate-id() = generate-id(key('groups', item[@name='$workflowstatus']/value)[1])]" /> </collection> </xsl:template> <xsl:template match="/collection/document"> <status> <xsl:value-of select="item[@name='$workflowstatus']/value" /> </status> <xsl:for-each select="key('groups', item[@name='$workflowstatus']/value)"> <created> <xsl:value-of select="item[@name='$created']/value" /> </created> <amount> <xsl:value-of select="item[@name='_amount']/value" /> </amount> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Sum total by Category
The next example groups all entities by the Item Value “$workflowstatus” and returns the sum of the value ‘_amount’.
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:key name="groups" match="/collection/document" use="item[@name='$workflowstatus']/value" /> <xsl:template match="/"> <collection> <xsl:apply-templates select="/collection/document[generate-id() = generate-id(key('groups', item[@name='$workflowstatus']/value)[1])]" /> </collection> </xsl:template> <xsl:template match="/collection/document"> <status> <xsl:value-of select="item[@name='$workflowstatus']/value" /> </status> <total> <xsl:value-of select="sum(key('groups', item[@name='$workflowstatus']/value)//item[@name='_amount']/value)" /> </total> </xsl:template> </xsl:stylesheet>