Rules for converting ttData to EPCIS 1.1
The examples below are what you can expect the ttData2EPCIS.xsl stylesheeet to produce of output when transforming a ttData import file into a EPCIS import file. As observed by readers of the wiki, this will not always produce the most compact import file, it can look pretty verbose and hard to read. The reason for this is that we have a very flexible schema for defining import files in the ttData format, where i.e timestamps can be defined at several levels, with inheritance. We wanted to create a sufficient enough translation from the old to the new import file format, and that's the reason for the verboseness. The generated EPCIS import files are not primarily targeted humans to read.
TODO: More compact EPCIS import files can be created for sure, and examples should probably be added here, or somewhere else later.
Notes to EPCIS:
- Order of the elements in EPCIS is defined, so if you create EPCIS manually, you have to follow the order!
- eventTimeZoneOffset - If it's not found, it defaults to +00:00.
recordTimeelement will be added to all EPCIS event
Notes on the examples:
- EPCIS: ObjectEvent (ADD)
- Description: One ObjectEvent with action ADD is created for the Create
<Create> <Batch type="Hatchery_batch" itemRef="urn:gtnet:070100000001.hatch.*" id="urn:gtnet:070100000001.hatch.0001" timestamp="2001-01-01T12:00:00.0Z"> <Property prop-ref="ProjectNumber">hatch</Property> <Property prop-ref="CageNumber">1</Property> <Property prop-ref="Temperature" unit="celsius">8</Property> <Property prop-ref="HatchingDate">2001-01-01T12:00:00.0Z</Property> <Property prop-ref="Treatments">a</Property> <Property prop-ref="Mortality">5%</Property> </Batch></Create><ObjectEvent> <eventTime>2001-01-01T12:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>urn:gtnet:070100000001.hatch.0001</epc> </epcList> <action>ADD</action> <bizStep>urn:epcglobal:cbv:bizstep:commissioning</bizStep> <disposition>urn:epcglobal:cbv:disp:active</disposition> <gtnet:itemRef>urn:gtnet:070100000001.hatch.*</gtnet:itemRef> <ttdata:ProjectNumber>hatch</ttdata:ProjectNumber> <ttdata:CageNumber>1</ttdata:CageNumber> <ttdata:Temperature unit="celsius">8</ttdata:Temperature> <ttdata:HatchingDate>2001-01-01T12:00:00.0Z</ttdata:HatchingDate> <ttdata:Treatments>a</ttdata:Treatments> <ttdata:Mortality>5%</ttdata:Mortality> <gtnet:entityClass>Batch</gtnet:entityClass> <gtnet:trdType>Hatchery_batch</gtnet:trdType></ObjectEvent>- EPCIS: ObjectEvent (ADD and OBSERVE)
- Description: One ObjectEvent with action ADD is created for the Create. In addition, for each SentTo/ReceivedFrom a new ObjectEvent(OBSERVE) is created
<Create> <TradeUnit type="PackedGuttedFresh" itemRef="urn:gtnet:070100000001.gutfresh_1.*" id="urn:gtnet:070100000001.gutfresh_1.0001" timestamp="2004-07-03T08:00:00.0Z"> <SentTo organization="Retailer" orgType="org-mapping" timestamp="2004-07-03T08:00:00.0Z"/> <Property prop-ref="Species">Salmon</Property> <Property prop-ref="Treatments">Gutted</Property> <Property prop-ref="Quality">Superior</Property> <Property prop-ref="Size">4-5</Property> <Property prop-ref="Pcs">5</Property> <Property prop-ref="BoxNo">1001</Property> <Property prop-ref="PlNo">8000</Property> <Property prop-ref="NetWeight">21,40 kg</Property> <Property prop-ref="UseBy">2004-07-17</Property> <Property prop-ref="Farmer">Fish Producer</Property> <Property prop-ref="OrderNo">1001</Property> <Property prop-ref="Preservation">Fresh</Property> <Property prop-ref="StorageTemp">0/ +4C</Property> <Property prop-ref="EANNo">(01)070100000001(10)gutfresh_1(21)0001</Property> <Property prop-ref="Exporter">Retailer</Property> <Property prop-ref="WhereOnEarth">36° 0'4.21"N, 5°36'33.92"W</Property> </TradeUnit></Create><!--Create->TradeUnit => ObjectEvent(ADD)--> <ObjectEvent> <eventTime>2004-07-03T08:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>urn:gtnet:070100000001.gutfresh_1.0001</epc> </epcList> <action>ADD</action> <bizStep>urn:epcglobal:cbv:bizstep:commissioning</bizStep> <disposition>urn:epcglobal:cbv:disp:active</disposition> <gtnet:itemRef>urn:gtnet:070100000001.gutfresh_1.*</gtnet:itemRef> <ttdata:Species>Salmon</ttdata:Species> <ttdata:Treatments>Gutted</ttdata:Treatments> <ttdata:Quality>Superior</ttdata:Quality> <ttdata:Size>4-5</ttdata:Size> <ttdata:Pcs>5</ttdata:Pcs> <ttdata:BoxNo>1001</ttdata:BoxNo> <ttdata:PlNo>8000</ttdata:PlNo> <ttdata:NetWeight>21,40 kg</ttdata:NetWeight> <ttdata:UseBy>2004-07-17</ttdata:UseBy> <ttdata:Farmer>Fish Producer</ttdata:Farmer> <ttdata:OrderNo>1001</ttdata:OrderNo> <ttdata:Preservation>Fresh</ttdata:Preservation> <ttdata:StorageTemp>0/ +4C</ttdata:StorageTemp> <ttdata:EANNo>(01)070100000001(10)gutfresh_1(21)0001</ttdata:EANNo> <ttdata:Exporter>Retailer</ttdata:Exporter> <ttdata:WhereOnEarth>36° 0'4.21"N, 5°36'33.92"W</ttdata:WhereOnEarth> <gtnet:entityClass>TradeUnit</gtnet:entityClass> <gtnet:trdType>PackedGuttedFresh</gtnet:trdType> </ObjectEvent> <!--SentTo => ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2004-07-03T08:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>urn:gtnet:070100000001.gutfresh_1.0001</epc> </epcList> <action>OBSERVE</action> <bizStep>urn:epcglobal:cbv:bizstep:shipping</bizStep> <disposition>urn:epcglobal:cbv:disp:in_transit</disposition> <extension> <destinationList> <destination type="urn:epcglobal:cbv:sdt:possessing_party">urn:gtnet:id:org:org-mapping.Retailer</destination> </destinationList> </extension> </ObjectEvent> - EPCIS: ObjectEvent (ADD and OBSERVE)
- Description:
<Create> <TradeUnit type="Product" id="urn:gtnet:070306400001.Prod_1.0002" itemRef="urn:gtnet:070306400001.Prod_1.*" timestamp="2001-01-02T13:00:00.0Z"> <ReceivedFrom organization="no.feed" orgType="org-name" timestamp="2001-02-02T13:00:00.0Z"/> <Property prop-ref="Supplier">Feed Company</Property> <Property prop-ref="DeliveryDate">2001-01-02T13:00:00.0Z</Property> <Property prop-ref="BatchNo">c</Property> <Property prop-ref="ProdDate">2001-01-01T12:00:00.0Z</Property> <Property prop-ref="ProductName">Feed smolt</Property> <Property prop-ref="ProductNo">1</Property> </TradeUnit></Create><!--Create->TradeUnit =>ObjectEvent(ADD)--> <ObjectEvent> <eventTime>2001-01-02T13:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>urn:gtnet:070306400001.Prod_1.0002</epc> </epcList> <action>ADD</action> <bizStep>urn:epcglobal:cbv:bizstep:commissioning</bizStep> <disposition>urn:epcglobal:cbv:disp:active</disposition> <gtnet:itemRef>urn:gtnet:070306400001.Prod_1.*</gtnet:itemRef> <ttdata:Supplier>Feed Company</ttdata:Supplier> <ttdata:DeliveryDate>2001-01-02T13:00:00.0Z</ttdata:DeliveryDate> <ttdata:BatchNo>c</ttdata:BatchNo> <ttdata:ProdDate>2001-01-01T12:00:00.0Z</ttdata:ProdDate> <ttdata:ProductName>Feed smolt</ttdata:ProductName> <ttdata:ProductNo>1</ttdata:ProductNo> <gtnet:entityClass>TradeUnit</gtnet:entityClass> <gtnet:trdType>Product</gtnet:trdType> </ObjectEvent> <!--ReceivedFrom =>ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2001-02-02T13:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>urn:gtnet:070306400001.Prod_1.0002</epc> </epcList> <action>OBSERVE</action> <bizStep>urn:epcglobal:cbv:bizstep:receiving</bizStep> <disposition>urn:epcglobal:cbv:disp:in_transit</disposition> <extension> <sourceList> <source type="urn:epcglobal:cbv:sdt:possessing_party">urn:gtnet:id:org:org-name.no.feed</source> </sourceList> </extension> </ObjectEvent> - EPCIS: ObjectEvent (OBSERVE/DELETE)
- Description: Each Property element is transformed to a new ObjectEvent with action OBSERVE. Each Remove element is transformed to a new ObjectEvent with action DELETE.
<Message> <BatchMsg id="urn:gtnet:070306400001.prod_1.0001"> <Property prop-ref="ProductName" timestamp="2001-01-05T13:00:00.0Z" unit="powerpoint">NewSmolt</Property> <Property prop-ref="ProductName" timestamp="2002-02-02T13:00:00.0Z">EvenNewerSmolt</Property> <Remove timestamp="2002-02-02T13:00:00.0Z" eventTimeZoneOffset="+02:00"/> </BatchMsg></Message><!--BatchMsg->Property changed =>ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2001-01-05T13:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>urn:gtnet:070306400001.prod_1.0001</epc> </epcList> <action>OBSERVE</action> <ttdata:ProductName unit="powerpoint" timestamp="2001-01-05T13:00:00.0Z">NewSmolt</ttdata:ProductName> <gtnet:entityClass>Batch</gtnet:entityClass> </ObjectEvent> <!--BatchMsg->Property changed =>ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2002-02-02T13:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>urn:gtnet:070306400001.prod_1.0001</epc> </epcList> <action>OBSERVE</action> <ttdata:ProductName timestamp="2002-02-02T13:00:00.0Z">EvenNewerSmolt</ttdata:ProductName> <gtnet:entityClass>Batch</gtnet:entityClass> </ObjectEvent> <!--BatchMsg->Batch removed =>ObjectEvent(DELETE)--> <ObjectEvent> <eventTime>2002-02-02T13:00:00.0Z</eventTime> <eventTimeZoneOffset>+02:00</eventTimeZoneOffset> <epcList> <epc>urn:gtnet:070306400001.prod_1.0001</epc> </epcList> <action>DELETE</action> <gtnet:entityClass>Batch</gtnet:entityClass> </ObjectEvent> - EPCIS: ObjectEvent (OBSERVE)
- Description: Each Property element is transformed to a new ObjectEvent with action OBSERVE.Each SentTo and ReceivedFrom element is transformed to a new ObjectEvent with action OBSERVE. Each External element is transformed to a new ObjectEvent with action OBSERVE where externalId becomes gtnet:alternateId and epc receivedId becomes epc.
<Message> <TradeUnitMsg id="ReceivedRM"> <ReceivedFrom orgType="gln" timestamp="2001-01-02T13:00:00.0Z" organization="7080000718160"/> <SentTo orgType="gln" timestamp="2001-02-02T13:00:00.0Z" organization="7080000701438"/> <External externalId="101" receivedId="102"/> <Property prop-ref="PurchasingOrderNo" timestamp="2001-01-05T13:00:00.0Z" unit="celsius">2</Property> </TradeUnitMsg></Message><!--TradeUnitMsg->TradeUnit ReceivedFrom =>ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2001-01-02T13:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>ReceivedRM</epc> </epcList> <action>OBSERVE</action> <bizStep>urn:epcglobal:cbv:bizstep:receiving</bizStep> <disposition>urn:epcglobal:cbv:disp:in_transit</disposition> <extension> <sourceList> <source type="urn:epcglobal:cbv:sdt:possessing_party">urn:gtnet:id:org:gln.7080000718160</source> </sourceList> </extension> </ObjectEvent><!--TradeUnitMsg->TradeUnit SentTo =>ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2001-02-02T13:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>ReceivedRM</epc> </epcList> <action>OBSERVE</action> <bizStep>urn:epcglobal:cbv:bizstep:shipping</bizStep> <disposition>urn:epcglobal:cbv:disp:in_transit</disposition> <extension> <destinationList> <destination type="urn:epcglobal:cbv:sdt:possessing_party">urn:gtnet:id:org:gln.7080000701438</destination> </destinationList> </extension> </ObjectEvent> <!--TradeUnitMsg->Property changed =>ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2001-01-05T13:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>ReceivedRM</epc> </epcList> <action>OBSERVE</action> <ttdata:PurchasingOrderNo unit="celsius" timestamp="2001-01-05T13:00:00.0Z">2</ttdata:PurchasingOrderNo> <gtnet:entityClass>TradeUnit</gtnet:entityClass> </ObjectEvent> - EPCIS: AggregationEvent(ADD)
- Description: Each From element is transformed to a new AggregationEvent with action ADD
<TransMsg> <Mix into="123" timestamp="2001-01-02T13:00:00.0Z" amount="12" unit="kilogram"> <From id="Product" unit="gram" amount="11" timestamp="2001-01-02T14:00:00.0Z"/> <From id="Production" timestamp="2001-01-02T15:00:00.0Z"/> </Mix></TransMsg> <extension> <TransformationEvent> <eventTime>2001-01-02T14:00:00.000Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <inputEPCList> <epc>Product</epc> </inputEPCList> <outputEPCList> <epc>123</epc> </outputEPCList> <gtnet-epcis:transformationType>MIX</gtnet-epcis:transformationType> <gtnet-epcis:amountPerChild>11</gtnet-epcis:amountPerChild> <gtnet-epcis:amountUnit>gram</gtnet-epcis:amountUnit> </TransformationEvent> </extension> <extension> <TransformationEvent> <eventTime>2001-01-02T15:00:00.000Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <inputEPCList> <epc>Production</epc> </inputEPCList> <outputEPCList> <epc>123</epc> </outputEPCList> <gtnet-epcis:transformationType>MIX</gtnet-epcis:transformationType> <gtnet-epcis:amountPerChild>12</gtnet-epcis:amountPerChild> <gtnet-epcis:amountUnit>kilogram</gtnet-epcis:amountUnit> </TransformationEvent> </extension>
- EPCIS: AggregationEvent(ADD)
- Description: Each Into element is transformed to a new AggregationEvent with action DELETE.
<TransMsg> <Split from="prod_1" timestamp="2001-01-05T13:00:00.0Z"> <Into id="prod_12" amount=".56" unit="kg" timestamp="2001-01-05T13:00:00.0Z"/> </Split></TransMsg> <extension> <TransformationEvent> <eventTime>2001-01-05T13:00:00.000Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <inputEPCList> <epc>prod_1</epc> </inputEPCList> <outputEPCList> <epc>prod_12</epc> </outputEPCList> <gtnet-epcis:transformationType>SPLIT</gtnet-epcis:transformationType> <gtnet-epcis:amountPerChild>.56</gtnet-epcis:amountPerChild> <gtnet-epcis:amountUnit>kg</gtnet-epcis:amountUnit> </TransformationEvent> </extension>
- EPCIS: AggregationEvent(ADD)
- Description: Each From element is transformed to a new AggregationEvent with action ADD. Each From will also get a new ObjectEvent with action DELETE.
<TransMsg> <Join into="prod_15" timestamp="2001-01-05T14:00:00.0Z" eventTimeZoneOffset="+03:00"> <From id="prod_101" timestamp="2001-01-05T14:10:00.0Z"/> <From id="prod_102" timestamp="2001-01-05T14:20:00.0Z"/> </Join></TransMsg> <extension> <TransformationEvent> <eventTime>2001-01-05T14:10:00.000Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <inputEPCList> <epc>prod_101</epc> </inputEPCList> <outputEPCList> <epc>prod_15</epc> </outputEPCList> <gtnet-epcis:transformationType>JOIN</gtnet-epcis:transformationType> </TransformationEvent> </extension> <extension> <TransformationEvent> <eventTime>2001-01-05T14:20:00.000Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <inputEPCList> <epc>prod_102</epc> </inputEPCList> <outputEPCList> <epc>prod_15</epc> </outputEPCList> <gtnet-epcis:transformationType>JOIN</gtnet-epcis:transformationType> </TransformationEvent> </extension>
- EPCIS: AggregationEvent (DELETE)
- Description: Convert is transformed into an AggregationEvent with action DELETE. The from attribute is turned into parentID and id is turned into childEPC.
<TransMsg> <Convert from="prod_15" timestamp="2001-01-05T15:00:00.0Z"> <Into id="finished_product" timestamp="2001-01-05T16:00:00.0Z"/> </Convert></TransMsg> <extension> <TransformationEvent> <eventTime>2001-01-05T16:00:00.000Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <inputEPCList> <epc>prod_15</epc> </inputEPCList> <outputEPCList> <epc>finished_product</epc> </outputEPCList> <gtnet-epcis:transformationType>CONVERT</gtnet-epcis:transformationType> </TransformationEvent> </extension>
- EPCIS: AggregationEvent (ADD)
- Description: Each From element is transformed to a new AggregationEvent with action ADD.
<TransMsg> <EnterCluster into="finished_product" timestamp="2001-01-05T17:00:00.0Z"> <From id="prod_11" timestamp="2001-01-05T18:00:00.0Z"/> <From id="prod_12"/> </EnterCluster></TransMsg><!--Message->TransMsg->EnterCluster =>AggregationEvent(ADD)--> <AggregationEvent> <eventTime>2001-01-05T18:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <parentID>finished_product</parentID> <childEPCs> <epc>prod_11</epc> </childEPCs> <action>ADD</action> <bizStep>urn:epcglobal:cbv:bizstep:packing</bizStep> <gtnet:transformationType>ENTERCLUSTER</gtnet:transformationType></AggregationEvent> <AggregationEvent> <eventTime>2001-01-05T17:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <parentID>finished_product</parentID> <childEPCs> <epc>prod_12</epc> </childEPCs> <action>ADD</action> <bizStep>urn:epcglobal:cbv:bizstep:packing</bizStep> <gtnet:transformationType>ENTERCLUSTER</gtnet:transformationType></AggregationEvent>
- EPCIS: AggregationEvent (DELETE)
- Description: Each Into element is transformed to a new AggregationEvent with action DELETE.
<TransMsg> <LeaveCluster from="finished_product" timestamp="2001-01-05T18:00:00.0Z"> <Into id="prod_11" timestamp="2001-01-05T19:00:00.0Z"/> <Into id="prod_12"/> </LeaveCluster></TransMsg><!--Message->TransMsg->LeaveCluster =>AggregationEvent(DELETE)--> <AggregationEvent> <eventTime>2001-01-05T19:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <parentID>finished_product</parentID> <childEPCs> <epc>prod_11</epc> </childEPCs> <action>DELETE</action> <bizStep>urn:epcglobal:cbv:bizstep:packing</bizStep> <gtnet:transformationType>LEAVECLUSTER</gtnet:transformationType></AggregationEvent> <AggregationEvent> <eventTime>2001-01-05T18:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <parentID>finished_product</parentID> <childEPCs> <epc>prod_12</epc> </childEPCs> <action>DELETE</action> <bizStep>urn:epcglobal:cbv:bizstep:packing</bizStep> <gtnet:transformationType>LEAVECLUSTER</gtnet:transformationType></AggregationEvent>
- EPCIS: ObjectEvent (OBSERVE)
- Description: Each Property, EnterStation and LeaveStation element is transformed to a new ObjectEvent with action OBSERVE.
<StationMsg id="station_1"> <EnterStation timestamp="2001-01-05T19:00:00.0Z" id="prod_15"/> <LeaveStation timestamp="2001-01-05T20:00:00.0Z" id="prod_16"/> <Property prop-ref="temperature" timestamp="2001-01-05T19:00:00.0Z" unit="celcius">15</Property></StationMsg><!--StationMsg->EnterStation =>ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2001-01-05T19:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>prod_15</epc> </epcList> <action>OBSERVE</action> <bizStep>urn:epcglobal:cbv:bizstep:storing</bizStep> <bizLocation> <id>station_1</id> </bizLocation> <gtnet:stationMsg>enter</gtnet:stationMsg> <gtnet:entityClass>Location</gtnet:entityClass> </ObjectEvent> <!--StationMsg->LeaveStation =>ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2001-01-05T20:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>prod_16</epc> </epcList> <action>OBSERVE</action> <bizStep>urn:epcglobal:cbv:bizstep:stocking</bizStep> <bizLocation> <id>station_1</id> </bizLocation> <gtnet:stationMsg>leave</gtnet:stationMsg> <gtnet:entityClass>Location</gtnet:entityClass> </ObjectEvent> <!--StationMsg->Property changed =>ObjectEvent(OBSERVE)--> <ObjectEvent> <eventTime>2001-01-05T19:00:00.0Z</eventTime> <eventTimeZoneOffset>+00:00</eventTimeZoneOffset> <epcList> <epc>station_1</epc> </epcList> <action>OBSERVE</action> <ttdata:temperature unit="celcius" timestamp="2001-01-05T19:00:00.0Z">15</ttdata:temperature> <gtnet:entityClass>Location</gtnet:entityClass> </ObjectEvent>
Rules for converting EPCIS to ttData.