Sample OrderLevelPercentOff XSL template
The OrderLevelPercentOff XSL template transforms OrderLevelPercentOff promotions to an intermediate XML format. This sample XSL template only extracts the information from a runtime promotion XML that it needs to save to the PX_PROMOAUTH, PX_DESCRIPTION, PX_PROMOCD, PX_ELEMENT, and PX_ELEMENTNVP tables.
Sample
The following sample XML snippet is an example of an XSL template used to transform promotions to the Management Center data model using the promotion migration utility. Use this sample as a guideline when creating custom XML templates for your custom promotion types. In this example, this XSL template transforms promotions of type OrderLevelPercentOff (sample runtime XML OrderLevelPercentDiscount.xml) to the intermediate XML document used to populate the database tables. The migration utility selects the information to save to the database tables from the intermediate XML document based on certain tag names. Therefore, when defining the XSL template, you must use the exact predefined tag names that are highlighted later in this topic; otherwise the information will not be saved to the corresponding database table from the transformed XML document. The tree structure of the XSL template is used to determine the parent-child relationship between the elements. Additional information corresponding to the callout numbers is provided below the example.<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="PromotionMigrationTemplate" match="/">
<!-- handle default promotion rule -->
<PromotionMigrationData>
<px_promoauth> 1
<promotionType>
<xsl:value-of select="Promotion/CorrespondingRBDTypeName" />
</promotionType>
<dailyStartTime>
<xsl:value-of select="Promotion/Schedule/TimeWithinADay/Start" />
</dailyStartTime>
<dailyEndTime>
<xsl:value-of select="Promotion/Schedule/TimeWithinADay/End" />
</dailyEndTime>
<xsl:for-each select="Promotion/Schedule/Week/WeekDay">
<xsl:choose>
<xsl:when test=".='SUNDAY'">
<weekday_sun>1</weekday_sun>
</xsl:when>
<xsl:when test=".='MONDAY'">
<weekday_mon>1</weekday_mon>
</xsl:when>
<xsl:when test=".='TUESDAY'">
<weekday_tue>1</weekday_tue>
</xsl:when>
<xsl:when test=".='WEDNESDAY'">
<weekday_wed>1</weekday_wed>
</xsl:when>
<xsl:when test=".='THURSDAY'">
<weekday_thu>1</weekday_thu>
</xsl:when>
<xsl:when test=".='FRIDAY'">
<weekday_fri>1</weekday_fri>
</xsl:when>
<xsl:when test=".='SATURDAY'">
<weekday_sat>1</weekday_sat>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<comments>
<xsl:value-of select="Promotion/TypedNLDescription/Description[@type='admin']" />
</comments>
</px_promoauth>
<xsl:choose>
<xsl:when test="Promotion/PromotionCodeRequired='true'">
<PromotionCodeCue> 2
<xsl:value-of select="Promotion/PromotionCodeCue" />
</PromotionCodeCue>
</xsl:when>
</xsl:choose>
<xsl:for-each select="Promotion/TypedNLDescription/Description">
<px_description> 3
<language>
<xsl:value-of select="@locale" />
</language>
<type>
<xsl:value-of select="@type" />
</type>
<description>
<xsl:value-of select="." />
</description>
</px_description>
</xsl:for-each>
<!-- Px_element -->
<elements> 4
<element>
<type>TargetingCondition</type>
<subType>TargetingCondition</subType>
<xsl:for-each select="Promotion/Targeting/TargetedProfile/CustomerProfileKey">
<element>
<type>IncludeMemberGroupIdentifier</type>
<subType>Identifier_MemberGroup</subType>
<Data>
<OwnerDN>
<xsl:value-of select="OwnerDN" />
</OwnerDN>
<ProfileName>
<xsl:value-of select="ProfileName" />
</ProfileName>
</Data>
</element>
</xsl:for-each>
<xsl:for-each select="Promotion/Targeting/ExcludedProfile/CustomerProfileKey">
<element>
<type>ExcludeMemberGroupIdentifier</type>
<subType>Identifier_MemberGroup</subType>
<Data>
<OwnerDN>
<xsl:value-of select="OwnerDN" />
</OwnerDN>
<ProfileName>
<xsl:value-of select="ProfileName" />
</ProfileName>
</Data>
</element>
</xsl:for-each>
</element>
<element>
<type>PurchaseCondition</type>
<subType>OrderLevelPercentDiscountPurchaseCondition</subType>
<Data>
<Currency>
<xsl:value-of select="Promotion/PurchaseCondition/Distribution/Currency" />
</Currency>
</Data>
<xsl:for-each select="Promotion/PurchaseCondition/Distribution/Range">
<element>
<type>DiscountRange</type>
<subType>OrderLevelPercentOffDiscountRange</subType>
<Data>
<LowerBound>
<xsl:value-of select="LowerBound" />
</LowerBound>
<Percentage>
<xsl:value-of select="RewardChoice/Reward/AdjustmentFunction/Adjustment/Percentage" />
</Percentage>
</Data>
</element>
</xsl:for-each>
</element>
</elements>
</PromotionMigrationData>
</xsl:template>
</xsl:transform>
PX_PROMOAUTH node
1<px_promoauth>
node is static and common for
all promotion rules. In this sample, for the PX_PROMOAUTH node, the
predefined tag names for migration are highlighted:<px_promoauth>
<promotionType>
<xsl:value-of select="Promotion/CorrespondingRBDTypeName" />
</promotionType>
<dailyStartTime>
<xsl:value-of select="Promotion/Schedule/TimeWithinADay/Start" />
</dailyStartTime>
<dailyEndTime>
<xsl:value-of select="Promotion/Schedule/TimeWithinADay/End" />
</dailyEndTime>
<xsl:for-each select="Promotion/Schedule/Week/WeekDay">
<xsl:choose>
<xsl:when test=".='SUNDAY'">
<weekday_sun>1</weekday_sun>
</xsl:when>
<xsl:when test=".='MONDAY'">
<weekday_mon>1</weekday_mon>
</xsl:when>
<xsl:when test=".='TUESDAY'">
<weekday_tue>1</weekday_tue>
</xsl:when>
<xsl:when test=".='WEDNESDAY'">
<weekday_wed>1</weekday_wed>
</xsl:when>
<xsl:when test=".='THURSDAY'">
<weekday_thu>1</weekday_thu>
</xsl:when>
<xsl:when test=".='FRIDAY'">
<weekday_fri>1</weekday_fri>
</xsl:when>
<xsl:when test=".='SATURDAY'">
<weekday_sat>1</weekday_sat>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<comments>
<xsl:value-of select="Promotion/TypedNLDescription/Description[@type='admin']" />
</comments>
</px_promoauth>
PromotionCodeCue node
2<PromotionCodeCue>
<xsl:value-of select="Promotion/PromotionCodeCue" />
</PromotionCodeCue>
PX_DESCRIPTION node
3<px_description>
<language>
<xsl:value-of select="@locale" />
</language>
<type>
<xsl:value-of select="@type" />
</type>
<description>
<xsl:value-of select="." />
</description>
</px_description>
PX_ELEMENT and PX_ELEMENTNVP nodes
4The
migration utility looks for the elements
tag as the
start of element data. The top three elements, namely Targeting Condition,
Purchase Condition, and Custom Conditions, are defined using the element
tag.
The
value of the type
node for each element defines the
promotion concept used in the runtime promotion XML. For example,
the element type "PurchaseCondition" is similar to the "PurchaseCondition"
node in the runtime promotion XML. And the type "DiscountRange" is
similar to the "DistributionRange" node in the runtime promotion XML.
The value of the subType
node for each element is
used by the Management Center framework
to identify a specific user interface element that handles the input
from business user. The values of the type
and subType
nodes
are saved to the TYPE and SUBTYPE columns of the PX_ELEMENT table respectively.
See How promotion data is stored and managed for
sample PX_ELEMENT table content.
Data
node
under an element is used to define the name-value pairs for that element.
The nodes under the Data
node are used to extract
information to save to the PX_ELEMENTNVP table.
The name of these nodes is saved to the NAME column and their value
is saved to the corresponding VALUE column. For the predefined promotion
elements, the migration utility determines the ID based on the values
of the nodes defined under the Data node. For example, for the IncludeMemberGroupIdentifier
predefined element, the ID value is determined using the values of
the OwnerDN
and ProfileName
nodes.
The name of these predefined elements is saved as ID
in
the NAME column of the PX_ELEMENTNVP table, and the value which is
the corresponding ID value determined, is saved to the VALUE column.
In this sample, for the PX_ELEMENT and PX_ELEMENTNVP nodes, the predefined
tag names and values for migration are highlighted below.<elements>
<element>
<type>TargetingCondition</type>
<subType>TargetingCondition</subType>
<xsl:for-each select="Promotion/Targeting/TargetedProfile/CustomerProfileKey">
<element>
<type>IncludeMemberGroupIdentifier</type>
<subType>Identifier_MemberGroup</subType>
<Data>
<OwnerDN><xsl:value-of select="OwnerDN" /></OwnerDN>
<ProfileName>
<xsl:value-of select="ProfileName" />
</ProfileName>
</Data>
</element>
</xsl:for-each>
<xsl:for-each select="Promotion/Targeting/ExcludedProfile/CustomerProfileKey">
<element>
<type>ExcludeMemberGroupIdentifier</type>
<subType>Identifier_MemberGroup</subType>
<Data>
<OwnerDN><xsl:value-of select="OwnerDN" /></OwnerDN>
<ProfileName><xsl:value-of select="ProfileName" /></ProfileName>
</Data>
</element>
</xsl:for-each>
</element>
<element>
<type>PurchaseCondition</type>
<subType>OrderLevelPercentDiscountPurchaseCondition</subType>
<Data>
<Currency>
<xsl:value-of select="Promotion/PurchaseCondition/Distribution/Currency" />
</Currency>
</Data>
<xsl:for-each select="Promotion/PurchaseCondition/Distribution/Range">
<element>
<type>DiscountRange</type>
<subType>OrderLevelPercentOffDiscountRange</subType>
<Data>
<LowerBound><xsl:value-of select="LowerBound" /></LowerBound>
<Percentage>
<xsl:value-of
select="RewardChoice/Reward/AdjustmentFunction/Adjustment/Percentage" />
</Percentage>
</Data>
</element>
</xsl:for-each>
</element>
</elements>