Création du modèle XSLT pour transformation du code XML de la promotion

Créez un modèle XSLT personnalisé afin de transformer le code XML de création de la promotion en code XML d'exécution. Cette transformation intervient lorsqu'un professionnel active une promotion basée sur votre type de promotion personnalisé.

Avant de commencer

Consultez les rubriques suivantes pour bien comprendre le rôle des modèles XSLT :

Pourquoi et quand exécuter cette tâche

L'outil Promotions fournit un ensemble de modèles XSLT par défaut. Chaque type de promotion par défaut défini dans l'outil Promotions est configuré afin d'utiliser certains modèles. Lorsque vous créez un type de promotion personnalisé, vous devez créer un nouveau modèle XSLT personnalisé ; cependant, vous pouvez copier le contenu d'un modèle XSLT existant dans un fichier vierge, puis ne personnaliser que certaines sections.
Généralement, vous devez spécifier une nouvelle structure de condition d'achat pour un nouveau type de promotion. Pour le développement d'un nouveau modèle XSLT de condition d'achat, vous devez utiliser comme entrée des informations recueillies lors de deux étapes précédentes, à savoir :
  • La section de condition d'achat dans le code XML d'exécution de promotion que vous avez modélisée
  • Les données déterminées comme requises pour ce type de promotion spécifique depuis l'interface utilisateur du Centre de gestion

Procédure

  1. Créez le modèle XSLT pour l'élément du nouveau type de promotion que vous personnalisez. Dans la plupart des cas, il s'agit de l'élément <PurchaseCondition>.

    Si vous désirez utiliser comme point de départ l'un des modèles XSLT par défaut, ceux-ci sont stockés sous l'emplacement suivant :

    workspace_dir/WC/xml/config/com.ibm.commerce.promotion/template

    Le tableau suivant met en correspondance chaque modèle XSLT de condition d'achat avec son type de promotion par défaut :

    Modèles XSLT mappés aux types de promotion par défaut
    Modèle XSLT de condition d'achat Type de promotion par défaut
    CategoryAllItemAmountOffPurchaseConditionTemplate.xsl Montant déduit du sous-total des entrées de catalogue d'une catégorie
    CategoryAllItemFixedCostPurchaseConditionTemplate.xls Prix fixe sur le sous-total des entrées de catalogue d'une catégorie
    CategoryAllItemPercentOffPurchaseConditionTemplate.xsl Pourcentage de remise sur le sous-total des entrées de catalogue d'une catégorie
    CategoryFixedCostShippingPurchaseConditionTemplate.xls Pour l'achat d'entrées de catalogue de la catégorie X, frais de port fixes
    CategoryPerItemAmountOffPurchaseConditionTemplate.xsl Montant déduit sur des entrées de catalogue spécifiques d'une catégorie
    CategoryPerItemFixedCostPurchaseConditionTemplate.xls Prix fixe sur les entrées de catalogue individuelles d'une catégorie
    CategoryPerItemPercentOffPurchaseConditionTemplate.xsl Pourcentage de remise sur des entrées de catalogue spécifiques d'une catégorie
    CategoryPurchaseWithPurchasePercentOffPurchaseConditionTemplate.xls Pour l'achat d'entrées de catalogue de la catégorie X, pourcentage de remise sur l'entrée de catalogue Y
    CategorySameItemPercentOffPurchaseConditionTemplate.xsl Pour l'achat d'entrées de catalogue de la catégorie X, pourcentage de remise sur les entrées de catalogue supplémentaires de la catégorie X
    CategoryWithFreeGiftPurchaseConditionTemplate.xsl Pour l'achat d'entrées de catalogue de la catégorie X, entrée de catalogue Y offerte
    MultipleItemsGetYFixedAmountOffPurchaseConditionTemplate.xls Pour l'achat de A (et B et C), obtenez une remise sur Y
    MultipleItemsGetYPercentOffPurchaseConditionTemplate.xls Pour l'achat de A (et B et C), obtenez une remise en pourcentage sur Y
    MultipleItemsPercentOffPurchaseConditionTemplate.xsl Pour l'achat de A et de B, pourcentage de remise sur les deux
    OrderAmountOffPurchaseConditionTemplate.xsl Montant déduit d'une commande
    OrderFixedAmountOffShippingPurchaseConditionTemplate.xsl Remise sur frais de port d'une commande
    OrderFixedCostShippingPurchaseConditionTemplate.xsl Frais de port fixes sur l'expédition d'une commande
    OrderFreeGiftPurchaseConditionTemplate.xsl Cadeau offert avec une commande
    OrderPercentOffPurchaseConditionTemplate.xsl Pourcentage de remise sur une commande
    ProductAllItemAmountOffPurchaseConditionTemplate.xsl Montant déduit du sous-total des entrées de catalogue
    ProductAllItemFixedCostPurchaseConditionTemplate.xls Prix fixe sur le sous-total des entrées de catalogue
    ProductAllItemPercentOffPurchaseConditionTemplate.xsl Pourcentage de remise sur le sous-total des entrées de catalogue
    ProductFixedCostShippingPurchaseConditionTemplate.xls Pour l'achat de l'entrée de catalogue X, frais de port fixes
    ProductPerItemAmountOffPurchaseConditionTemplate.xsl Montant déduit sur des entrées de catalogue spécifiques
    ProductPerItemFixedCostPurchaseConditionTemplate.xls Prix fixe sur les entrées de catalogue individuelles
    ProductPerItemPercentOffPurchaseConditionTemplate.xsl Pourcentage de remise sur des entrées de catalogue spécifiques
    ProductPurchaseWithPurchasePercentOffPurchaseConditionTemplate.xsl Pour l'achat de l'entrée de catalogue X, pourcentage de remise sur l'entrée de catalogue Y
    ProductSameItemPercentOffPurchaseConditionTemplate.xsl Pour l'achat d'une entrée de catalogue X, pourcentage de remise sur les entrées X supplémentaires
    ProductWithFreeGiftPurchaseConditionTemplate.xsl Pour l'achat d'entrée de catalogue X, entrée de catalogue Y offerte

    Outre le modèle XSLT de condition d'achat, trois autres modèles XSLT sont fournis. Ces derniers sont utilisés pour tous les types de promotion par défaut.

    Modèles XSLT mappés aux types de promotion par défaut
    Modèle XSLT de condition d'achat Objectif
    DefaultTargetingConditionTemplate.xsl Transforme le code XML de création de promotion afin de générer la section targetingCondition du code XML d'exécution de la promotion.
    DefaultCustomConditionsTemplate.xsl Transforme le code XML de création de promotion afin de générer la section customCondition du code XML d'exécution de la promotion.
    DefaultBasePromotionTemplate.xsl Transforme le code XML de création de promotion afin de générer la section basePromotion du code XML d'exécution de la promotion.
  2. Sauvegardez votre fichier de modèle XSLT personnalisé sous le répertoire suivant :

    workspace_dir/WC/xml/config/com.ibm.commerce.promotion-ext/template

Exemple

Dans le cadre de votre type de promotion personnalisé, Les clients acquérant deux chaises de table (FULO-01) se qualifient pour l'achat d'une table haute (FULO-02) au prix promotionnel de $200, vous devez créer un modèle XSL personnalisé pour l'élément <PurchaseCondition> intitulé ProductPurchaseWithPurchaseFixedCostPurchaseConditionTemplate.xsl. Il sera similaire à l'exemple suivant :
<?xml version="1.0" encoding="UTF-8"?> 
   <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <!-- handles purchase condition -->
      <xsl:template name="PurchaseConditionTemplate" match="/">
         <PurchaseCondition impl="com.ibm.commerce.marketing.promotion.condition.PurchaseCondition">
            <Pattern impl="com.ibm.commerce.marketing.promotion.condition.Pattern">
               <Constraint impl="com.ibm.commerce.marketing.promotion.condition.Constraint">
                  <WeightedRange impl="com.ibm.commerce.marketing.promotion.condition.WeightedRange">
                     <LowerBound>
                        <xsl:value-of  select="PromotionData/Elements/PurchaseCondition/Purchase/Data/Quantity" />
                     </LowerBound>
                     <UpperBound>
                        <xsl:value-of  select="PromotionData/Elements/PurchaseCondition/Purchase/Data/Quantity" />
                     </UpperBound>
                     <Weight>1</Weight>
                  </WeightedRange>
                  <FilterChain impl="com.ibm.commerce.marketing.promotion.condition.FilterChain">
                     <Filter impl="com.ibm.commerce.marketing.promotion.condition.MultiSKUFilter">
                        <xsl:for-each  select="PromotionData/Elements/PurchaseCondition/Purchase/IncludeCatalogEntryIdentifier">
                           <IncludeCatEntryKey>
                              <xsl:call-template name="CatalogEntryKeyTemplate">
                                 <xsl:with-param name="dn" select="Data/DN" />
                                 <xsl:with-param name="sku" select="Data/SKU" />
                              </xsl:call-template>
                           </IncludeCatEntryKey>
                        </xsl:for-each>
                        <xsl:for-each select="PromotionData/Elements/PurchaseCondition/Purchase/ExcludeCatalogEntryIdentifier">
                           <ExcludeCatEntryKey>
                              <xsl:call-template name="CatalogEntryKeyTemplate">
                                 <xsl:with-param name="dn" select="Data/DN" />
                                 <xsl:with-param name="sku" select="Data/SKU" />
                              </xsl:call-template>
                           </ExcludeCatEntryKey>
                        </xsl:for-each>
                     </Filter>
                  </FilterChain>
               </Constraint>
               <Constraint impl="com.ibm.commerce.marketing.promotion.condition.Constraint">
                  <WeightedRange impl="com.ibm.commerce.marketing.promotion.condition.WeightedRange">
                     <LowerBound>
                        <xsl:value-of select="PromotionData/Elements/PurchaseCondition/Reward/Data/Quantity" />
                     </LowerBound>
                     <UpperBound>
                        <xsl:value-of select="PromotionData/Elements/PurchaseCondition/Reward/Data/Quantity" />
                     </UpperBound>
                     <Weight>1</Weight>
                  </WeightedRange>
                  <FilterChain impl="com.ibm.commerce.marketing.promotion.condition.FilterChain">
                     <Filter impl="com.ibm.commerce.marketing.promotion.condition.MultiSKUFilter">
                        <xsl:for-each select="PromotionData/Elements/PurchaseCondition/Reward/IncludeCatalogEntryIdentifier">
                           <IncludeCatEntryKey>
                              <xsl:call-template name="CatalogEntryKeyTemplate">
                                 <xsl:with-param name="dn" select="Data/DN" />
                                 <xsl:with-param name="sku" select="Data/SKU" />
                              </xsl:call-template>
                           </IncludeCatEntryKey>
                        </xsl:for-each>
                        <xsl:for-each select="PromotionData/Elements/PurchaseCondition/Reward/ExcludeCatalogEntryIdentifier">
                           <ExcludeCatEntryKey>
                              <xsl:call-template name="CatalogEntryKeyTemplate">
                                 <xsl:with-param name="dn" select="Data/DN" />
                                 <xsl:with-param name="sku" select="Data/SKU" />
                              </xsl:call-template>
                           </ExcludeCatEntryKey>
                        </xsl:for-each>
                     </Filter>
                  </FilterChain>
               </Constraint>
            </Pattern>
            <Distribution impl="com.ibm.commerce.marketing.promotion.reward.Distribution">
               <Type>Volume</Type>
               <Base>Quantity</Base>
               <Currency>
                  <xsl:value-of select="PromotionData/Elements/PurchaseCondition/Data/Currency" />
               </Currency>
               <Range impl="com.ibm.commerce.marketing.promotion.reward.DistributionRange">
                  <LowerBound>1</LowerBound>
                  <UpperBound>-1</UpperBound>
                  <LowerBoundIncluded>true</LowerBoundIncluded>
                  <UpperBoundIncluded>false</UpperBoundIncluded>
                  <RewardChoice>
                     <Reward impl="com.ibm.commerce.marketing.promotion.reward.DefaultReward">
                        <AdjustmentFunction impl="com.ibm.commerce.marketing.promotion.reward.AdjustmentFunction">
                           <FilterChain impl="com.ibm.commerce.marketing.promotion.condition.FilterChain">
                              <Filter impl="com.ibm.commerce.marketing.promotion.condition.MultiSKUFilter">
                                 <xsl:for-each select="PromotionData/Elements/PurchaseCondition/Reward/IncludeCatalogEntryIdentifier">
                                    <IncludeCatEntryKey>
                                       <xsl:call-template name="CatalogEntryKeyTemplate">
                                          <xsl:with-param name="dn" select="Data/DN" />
                                          <xsl:with-param name="sku" select="Data/SKU" />
                                       </xsl:call-template>
                                    </IncludeCatEntryKey>
                                 </xsl:for-each>
                                 <xsl:for-each select="PromotionData/Elements/PurchaseCondition/Reward/ExcludeCatalogEntryIdentifier">
                                    <ExcludeCatEntryKey>
                                       <xsl:call-template name="CatalogEntryKeyTemplate">
                                          <xsl:with-param name="dn" select="Data/DN" />
                                          <xsl:with-param name="sku" select="Data/SKU" />
                                       </xsl:call-template>
                                    </ExcludeCatEntryKey>
                                 </xsl:for-each>
                              </Filter>
                           </FilterChain>
                           <Adjustment impl="com.ibm.commerce.marketing.promotion.reward.FixedCostAdjustment">
                              <FixedCost>
                                 <xsl:value-of select="PromotionData/Elements/PurchaseCondition/Data/FixedCost" />
                              </FixedCost>
                              <AdjustmentType>IndividualAffectedItems</AdjustmentType>
                                 <Currency>
                                    <xsl:value-of select="PromotionData/Elements/PurchaseCondition/Data/Currency" />
                                 </Currency>
                              </Adjustment>
                           </AdjustmentFunction>
                        </Reward>
                     </RewardChoice>
                  </Range>
                  <PatternFilter impl="com.ibm.commerce.marketing.promotion.condition.DummyPatternFilter">
                  </PatternFilter>
               </Distribution>
            </PurchaseCondition>
         </xsl:template>

         <!-- handles CatalogEntryKey -->
         <xsl:template name="CatalogEntryKeyTemplate">
            <xsl:param name="dn" />
            <xsl:param name="sku" />
            <CatalogEntryKey>
               <DN>
                  <xsl:value-of select="$dn" />
               </DN>
               <SKU>
                  <xsl:value-of select="$sku" />
               </SKU>
            </CatalogEntryKey>
         </xsl:template>
      </xsl:transform>
Pour qu'une promotion s'applique à l'article le moins cher, remplacez les contraintes existantes dans le fichier CategorySameItemPercentOffPurchaseConditionTemplate.xsl par les contraintes suivantes :
Important : Vous devez d'abord activer ApplyPromotionOnLowestPricedOrderItemsFirst pour que les contraintes fonctionnent.
<Constraint impl="com.ibm.commerce.marketing.promotion.condition.Constraint">
	<WeightedRange impl="com.ibm.commerce.marketing.promotion.condition.WeightedRange">
		<LowerBound>
			<xsl:value-of select="PromotionData/Elements/PurchaseCondition/Data/BaseQuantity" />
		</LowerBound>
		<UpperBound>
			<xsl:value-of select="PromotionData/Elements/PurchaseCondition/Data/BaseQuantity" />
		</UpperBound>
		<Weight>1</Weight>
	</WeightedRange>
	<FilterChain impl="com.ibm.commerce.marketing.promotion.condition.FilterChain">
		<Filter impl="com.ibm.commerce.marketing.promotion.condition.CategoryFilter">
			<xsl:for-each select="PromotionData/Elements/PurchaseCondition/IncludeCategoryIdentifier">
				<IncludeCategory>
					<xsl:call-template name="CategoryKeyTemplate">
						<xsl:with-param name="dn" select="Data/DN" />
						<xsl:with-param name="name" select="Data/Name" />
					</xsl:call-template>
				</IncludeCategory>
			</xsl:for-each>
			<xsl:for-each select="PromotionData/Elements/PurchaseCondition/ExcludeCategoryIdentifier">
				<ExcludeCategory>
					<xsl:call-template name="CategoryKeyTemplate">
						<xsl:with-param name="dn" select="Data/DN" />
						<xsl:with-param name="name" select="Data/Name" />
					</xsl:call-template>
				</ExcludeCategory>
			</xsl:for-each>
		</Filter>
		<xsl:choose>
			<xsl:when test="PromotionData/Elements/PurchaseCondition/ExcludeCatalogEntryIdentifier">
			<!-- Only populate when there are exclude items -->
				<Filter impl="com.ibm.commerce.marketing.promotion.condition.MultiSKUFilter">
					<xsl:for-each select="PromotionData/Elements/PurchaseCondition/ExcludeCatalogEntryIdentifier">
						<ExcludeCatEntryKey>
							<xsl:call-template name="CatalogEntryKeyTemplate">
								<xsl:with-param name="dn" select="Data/DN" />
								<xsl:with-param name="sku" select="Data/SKU" />
							</xsl:call-template>
						</ExcludeCatEntryKey>
					</xsl:for-each>
				</Filter>
			</xsl:when>
		</xsl:choose>
		<xsl:choose>
			<xsl:when test="PromotionData/Elements/PurchaseCondition/CatalogEntryAttributeRule">
			<!-- Only populate when there are attributes -->
				<Filter	impl="com.ibm.commerce.marketing.promotion.condition.CatalogEntryAttributeFilter">
					<AssociatedLanguage><xsl:value-of select="PromotionData/Elements/PurchaseCondition/Data/Language" />
                                   </AssociatedLanguage>
					<CaseSensitive>false</CaseSensitive>
					<SupportAttributeWithNoAssociatedLanguage>true</SupportAttributeWithNoAssociatedLanguage>
					<xsl:for-each select="PromotionData/Elements/PurchaseCondition/CatalogEntryAttributeRule">
						<xsl:call-template name="CatalogEntryAttributeRuleTemplate">
							<xsl:with-param name="attributeRule" select="." />
						</xsl:call-template>	
					</xsl:for-each>					
				</Filter>
			</xsl:when>
		</xsl:choose>
		<xsl:choose>
			<xsl:when test="PromotionData/Elements/PurchaseCondition/IncludePaymentTypeIdentifier">
				<xsl:choose>
					<xsl:when test="PromotionData/Elements/PurchaseCondition/IncludePaymentTypeIdentifier/Data/PaymentType != 'Any'">
						<Filter impl="com.ibm.commerce.marketing.promotion.condition.PaymentTypeFilter">
							<IncludePaymentType>
								<PaymentMethodName><xsl:value-of 
select="PromotionData/Elements/PurchaseCondition/IncludePaymentTypeIdentifier/Data/PaymentType" />
                                                        </PaymentMethodName>
							</IncludePaymentType>
						</Filter>
					</xsl:when>
				</xsl:choose>						
			</xsl:when>
		</xsl:choose>						
		<Filter impl="com.ibm.commerce.marketing.promotion.condition.ItemSortingFilter">
			<SortingMethod>PriceHighToLow</SortingMethod>
			<SplitMethod>SplitEndToStart</SplitMethod>    	
		</Filter>								
	</FilterChain>
</Constraint>
<Constraint impl="com.ibm.commerce.marketing.promotion.condition.Constraint">
	<WeightedRange impl="com.ibm.commerce.marketing.promotion.condition.WeightedRange">
		<LowerBound>
			<xsl:value-of select="PromotionData/Elements/PurchaseCondition/Data/RewardQuantity" />
		</LowerBound>
		<UpperBound>
			<xsl:value-of select="PromotionData/Elements/PurchaseCondition/Data/RewardQuantity" />
		</UpperBound>
		<Weight>1</Weight>
	</WeightedRange>
	<FilterChain impl="com.ibm.commerce.marketing.promotion.condition.FilterChain">
		<Filter impl="com.ibm.commerce.marketing.promotion.condition.CategoryFilter">
			<xsl:for-each select="PromotionData/Elements/PurchaseCondition/IncludeCategoryIdentifier">
				<IncludeCategory>
					<xsl:call-template name="CategoryKeyTemplate">
						<xsl:with-param name="dn" select="Data/DN" />
						<xsl:with-param name="name" select="Data/Name" />
					</xsl:call-template>
				</IncludeCategory>
			</xsl:for-each>
			<xsl:for-each select="PromotionData/Elements/PurchaseCondition/ExcludeCategoryIdentifier">
				<ExcludeCategory>
					<xsl:call-template name="CategoryKeyTemplate">
						<xsl:with-param name="dn" select="Data/DN" />
						<xsl:with-param name="name" select="Data/Name" />
					</xsl:call-template>
				</ExcludeCategory>
			</xsl:for-each>
		</Filter>
		<xsl:choose>
			<xsl:when test="PromotionData/Elements/PurchaseCondition/ExcludeCatalogEntryIdentifier">
			<!-- Only populate when there are exclude items -->
				<Filter impl="com.ibm.commerce.marketing.promotion.condition.MultiSKUFilter">
					<xsl:for-each select="PromotionData/Elements/PurchaseCondition/ExcludeCatalogEntryIdentifier">
						<ExcludeCatEntryKey>
							<xsl:call-template name="CatalogEntryKeyTemplate">
								<xsl:with-param name="dn" select="Data/DN" />
								<xsl:with-param name="sku" select="Data/SKU" />
							</xsl:call-template>
						</ExcludeCatEntryKey>
					</xsl:for-each>
				</Filter>
			</xsl:when>
		</xsl:choose>
		<xsl:choose>
			<xsl:when test="PromotionData/Elements/PurchaseCondition/CatalogEntryAttributeRule">
			<!-- Only populate when there are attributes -->
				<Filter
					impl="com.ibm.commerce.marketing.promotion.condition.CatalogEntryAttributeFilter">
					<AssociatedLanguage><xsl:value-of select="PromotionData/Elements/PurchaseCondition/Data/Language" />
                                   </AssociatedLanguage>
					<CaseSensitive>false</CaseSensitive>
					<SupportAttributeWithNoAssociatedLanguage>true</SupportAttributeWithNoAssociatedLanguage>
					<xsl:for-each select="PromotionData/Elements/PurchaseCondition/CatalogEntryAttributeRule">
						<xsl:call-template name="CatalogEntryAttributeRuleTemplate">
							<xsl:with-param name="attributeRule" select="." />
						</xsl:call-template>	
					</xsl:for-each>					
				</Filter>
			</xsl:when>
		</xsl:choose>
		<xsl:choose>
			<xsl:when test="PromotionData/Elements/PurchaseCondition/IncludePaymentTypeIdentifier">
				<xsl:choose>
					<xsl:when test="PromotionData/Elements/PurchaseCondition/IncludePaymentTypeIdentifier/Data/PaymentType != 'Any'">
						<Filter impl="com.ibm.commerce.marketing.promotion.condition.PaymentTypeFilter">
							<IncludePaymentType>
								<PaymentMethodName><xsl:value-of
select="PromotionData/Elements/PurchaseCondition/IncludePaymentTypeIdentifier/Data/PaymentType" />
								</PaymentMethodName>
							</IncludePaymentType>
						</Filter>
					</xsl:when>
				</xsl:choose>						
			</xsl:when>
		</xsl:choose>	
		<Filter impl="com.ibm.commerce.marketing.promotion.condition.ItemSortingFilter">
			<SortingMethod>PriceLowToHigh</SortingMethod>        	
		</Filter>								
	</FilterChain>
</Constraint>