2010-06-15 3 views
0

J'ai un problème XSL difficile pour le moment. Je dois copier le XML existant, copier un certain élément (plus ses éléments enfants) et modifier la valeur de deux éléments-enfants. Les modifications sont: divisez la valeur de l'élément 'value' par 110 et modifiez la valeur de l'élément 'type' de 'normal' à 'discount'.Copier XML existant, dupliquer l'élément et modifier

Ceci est actuellement ce que j'ai:

XML actuel:

<dataset> 
    <data> 
    <prices> 
    <price> 
     <value>50.00</value> 
     <type>normal</type> 
    </price> 
    </prices> 
</data> 
</dataset> 

Résultat attendu

<dataset> 
    <data> 
    <prices> 
    <price> 
     <value>50.00</value> 
     <type>normal</type> 
    </price> 
    <price> 
     <value>45.00</value> 
     <type>discount</type> 
    </price> 
    </prices> 
</data> 
</dataset> 

Des preneurs? Je suis allé jusqu'à copier l'élément 'price' désiré en utilisant copy-of, mais je suis coincé sur la façon de le modifier ensuite.

Répondre

1

Votre spécification est un peu à l'écart - votre valeur résulte du fait que vous multipliez par .9, sans diviser par 110. Le tableau ci-dessous suppose que vous voulez tout éditer avec un prix "normal" - changer le modèle de correspondance votre noeud particulier ou un ensemble de noeuds.

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml"/> 

    <xsl:template match="/dataset/data/prices/price[type='normal']"> 
    <xsl:apply-templates/> 
    <xsl:copy> 
     <value><xsl:value-of select="format-number(value * 0.9, '0.00')"/></value> 
     <type>discount</type> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
0

En supposant que vous avez un modèle qui correspond à prix, il vous suffit d'ajouter la logique dont vous parlez:

<xsl:template match="price"> 
    <!-- xsl:copy or xsl:copy-of depending on how you did it --> 
    <xsl:copy> 
    <xsl:apply-templates/> 
    </xsl:copy> 
    <price> 
    <value> 
     <xsl:value-of select="value * 0.9"/> 
    </value> 
    <type>discount</type> 
    </price> 
</xsl:template> 

Je devine que votre opération est en fait « multiplier par 0,9 » fracture non » par 110 "puisque 45 n'est pas égal à 50 divisé par 110 (ni 45 égal à 50 divisé par 1.10).

Questions connexes