Sometimes you want to print a report of an item and there are no suitable report templates available. One solution is to define a type of universal report template that works for any type of item.
Below is an example of such a report. It traverses the item structure, in a fixed* number of steps, and prints names, types, description text and attributes of all items it finds. The example also uses a filter to avoid “Reference” parts, since those have no specific meaning and are more likely to include recursive item structures.
XML
<Report> <FontStyles> <FontStyle name="Minor" style="italic" font="Segoe UI" size="6"/> </FontStyles> <Filter name="isNotRef"> <Not> <PartTypeEquals sid="IDR"/> </Not> </Filter> <Text></Text> <TimeNow/> <TableOfContents max_level="3"/> <!-- To control the number of recursion calls--> <Variable name="PartGroupDepth" as="Integer" select="10"/> <Section title="#{Type.Name}: #{Name}"> <Text font="Minor">SystemWeaver ID: #{Handle} Version: #{Version} Status: #{Status} Date: #{?Now.Format('iso')}</Text> <Text/> <AttributeTable/> <Description/> <ApplyTemplate name="PartReport"> <WithParam name="p1" select="$PartGroupDepth"/> </ApplyTemplate> </Section> <Template name="ItemReportContent"> <Text font="Minor">SystemWeaver ID: #{Handle} Version: #{Version} Status: #{Status} Date: #{?Now.Format('iso')}</Text> <Text/> <AttributeTable/> <Description/> </Template> <Template name="PartReport"> <Parameter name="p1" as="Integer"/> <ForEachPartGroup> <ForEachPart> <If filter="isNotRef"> <Section title="#{Type.Name}/#{DefObj.Type.Name}: #{Name}"> <DefObj> <ApplyTemplate name="ItemReportContent"/> <If test="$p1 != 0"> <ApplyTemplate name="PartReport"> <WithParam name="p1" select="$p1 - 1"/> </ApplyTemplate> </If> </DefObj> </Section> </If> </ForEachPart> </ForEachPartGroup> </Template> </Report>
Result
* This kind of report cannot use item templates, since traversing all part types may result in “endless loops”. (The swExplorer will terminate at a fixed number of iterations, in order to avoid such loops)