The primary goals of this example are to introduce you to the following:
- Transforming from an edi file to xml.
- The Smooks configuration file.
- Executing the Smooks Transformation.
SVN - Download - Other Tutorials
Other Relevant Info:
- xslt-basic tutorial.
- XSLT Configuration Javadocs.
To Build: "mvn clean install"
To Run: "mvn exec:java"
Transforming from an edi file to xml
This is a very simple example that illustrates how Smooks to configure in a non-XML stream parser (CSV) into Smooks.
So here's the source edi file that is to be transformed:
HDR*1*0*59.97*64.92*4.95*Wed Nov 15 13:45:28 EST 2006 CUS*user1*Harry^Fletcher*SD ORD*1*1*364*The 40-Year-Old Virgin*29.98 ORD*2*1*299*Pulp Fiction*29.99
And this is the expected result of our transformation:
<Order>
<header>
<order-id>1</order-id>
<status-code>0</status-code>
<net-amount>59.97</net-amount>
<total-amount>64.92</total-amount>
<tax>4.95</tax>
<date>Wed Nov 15 13:45:28 EST 2006</date>
</header>
<customer-details>
<username>user1</username>
<name>
<firstname>Harry</firstname>
<lastname>Fletcher</lastname>
</name>
<state>SD</state>
</customer-details>
<order-item>
<position>1</position>
<quantity>1</quantity>
<product-id>364</product-id>
<title>The 40-Year-Old Virgin</title>
<price>29.98</price>
</order-item>
<order-item>
<position>2</position>
<quantity>1</quantity>
<product-id>299</product-id>
<title>Pulp Fiction</title>
<price>29.99</price>
</order-item>
</Order>
The Smooks Configuration
In order to apply this transformer to a message fragment, a Smooks Configurationneeds to be created. This configuration will target the transformer at a particular message fragment. For more information on configuring XSLT resources, see XslContentDeliveryUnitCreator.
Here's the configuration ("smooks-config.xml"):
<?xml version="1.0"?> <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd"> <!-- Configure the EDI Parser to parse the message stream into a stream of SAX events. --> <resource-config selector="org.xml.sax.driver"> <resource>org.milyn.smooks.edi.SmooksEDIParser</resource> <param name="mapping-model">/example/edi-to-xml-order-mapping.xml</param> </resource-config> </smooks-resource-list>
Here's the edi mapping ("/src/main/java/example/edi-to-xml-order-mapping.xml"):
<?xml version="1.0" encoding="UTF-8"?> <medi:edimap xmlns:medi="http://www.milyn.org/schema/edi-message-mapping-1.0.xsd"> <medi:description name="DVD Order" version="1.0" /> <medi:delimiters segment=" " field="*" component="^" sub-component="~" /> <medi:segments xmltag="Order"> <medi:segment segcode="HDR" xmltag="header"> <medi:field xmltag="order-id" /> <medi:field xmltag="status-code" /> <medi:field xmltag="net-amount" /> <medi:field xmltag="total-amount" /> <medi:field xmltag="tax" /> <medi:field xmltag="date" /> </medi:segment> <medi:segment segcode="CUS" xmltag="customer-details"> <medi:field xmltag="username" /> <medi:field xmltag="name"> <medi:component xmltag="firstname" /> <medi:component xmltag="lastname" /> </medi:field> <medi:field xmltag="state" /> </medi:segment> <medi:segment segcode="ORD" xmltag="order-item" maxOccurs="-1"> <medi:field xmltag="position" /> <medi:field xmltag="quantity" /> <medi:field xmltag="product-id" /> <medi:field xmltag="title" /> <medi:field xmltag="price" /> </medi:segment> </medi:segments> </medi:edimap>
Executing The Transformation
Again, it's exactly the same as with the java-basic tutorial:
// Instantiate Smooks with the config...
Smooks smooks = new Smooks("smooks-config.xml");
// Create an exec context - no profiles....
StandaloneExecutionContext executionContext = smooks.createExecutionContext();
// Filter the input message to the outputWriter, using the execution context...
DOMResult domResult = new DOMResult();
smooks.filter(new StreamSource(new ByteArrayInputStream(messageIn)), domResult, executionContext);
Of course, you'd typically cache the Smooks instance.
See the example/Main.java in the example source.