How to create a macro¶
The following example will describe how to create a macro to realize several calls to merge processor.
1. Create your view in a classic way¶
<view> <connector type="XMLConnector"> <parameter name="content"><![CDATA[ <root> <parent> <child1>data1</child1> <child2>data2</child2> <child3>data3</child3> </parent> </root> ]]></parameter> </connector> <processors> <merge nodes="/root/parent/*"/> <merge nodes="/root/parent"/> <merge nodes="/root/parent"/> </processors> </view>
2. Copy-paste code in a dedicated XSL file¶
Copy the block dedicated to be transformed as a macro into a template of the 2-macros.xsl file in the lavoisier-configuration module.
<xsl:template match="lav:processor[@type='MergeMacro']"> <merge nodes="/root/parent"/> <merge nodes="/root/parent"/> </xsl:template>
NB : to debug you can just move | copy 2-macros.xsl in /etc
TEST : check priority
3. Implement variables and process¶
The aim is now to finalize your macro making it generic and configurable.
<xsl:template match="lav:processor[@type='MergeMacro']"> <xsl:variable name="nodes" select="lav:parameter[@name='nodes']/text()"/> <xsl:param name="count" select="number(lav:parameter[@name='count']/text())"/> <xsl:if test="$count > 0"> <merge nodes="{$nodes}"/> <xsl:apply-templates select="."> <xsl:with-param name="count" select="$count - 1"/> </xsl:apply-templates> </xsl:if> </xsl:template>
4. Call the macro in the view¶
<view> <connector type="XMLConnector"> <parameter name="content"><![CDATA[ <root> <parent> <child1>data1</child1> <child2>data2</child2> <child3>data3</child3> </parent> </root>]]> </parameter> </connector> <processors> <merge nodes="/root/parent/*"/> <processor type="MergeMacro"> <parameter name="nodes">/root/parent</parameter> <parameter name="count">2</parameter> </processor> </processors> </view>
5. Create a plugin associated to this macro¶
Create src/fr/in2p3/lavoisier/adaptor/MergeMacro.java
file in lavoisier-configuration module.
This class will hold the plugin code to auto-completion and auto-documentations features.
public class MergeMacro implements Processor { public String getDescription() { return "This adaptor merges selected nodes with the N first children"; } public Parameter[] getUsage() { return new Parameter[]{ Parameter.xpath("nodes", "The selected nodes to be merged"), Parameter.integer("count", "The number of children to merge with selected nodes") }; } public void init(Configuration parameters) throws Exception {} }