Besoin de calculer la valeur de chaque boucle et montant en XSLT 1.0
Dire que j'ai un simple document XML d'entrée comme:
<Amounts>
<item>
<Base>4750</Base>
<Tax1>2800</Tax1>
<Tax2>50</Tax2>
</item>
<item>
<Base>4750</Base>
<Tax1>2800</Tax1>
<Tax2>50</Tax2>
</item>
</Amounts>
Et d'une transformation XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output version="1.0" method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:element name="MyTax">
<xsl:variable name="bf" select="sum(//item/Base)"/>
<xsl:variable name="discount" select="$bf * 0.08"/>
<xsl:variable name="bf1" select="$bf - $discount"/>
<xsl:variable name="yq1" select="sum(//item/Tax1)"/>
<xsl:variable name="yr1" select="sum(//item/Tax2)"/>
<xsl:variable name="stax">
<xsl:value-of select="round(format-number((($bf1 + $yq1 + $yr1) * 0.0495),'#.##'))"/>
</xsl:variable>
<xsl:element name="Stax"><xsl:value-of select="$stax"/></xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Nous obtenons une sortie XML:
<MyTax>
<Stax>715</Stax>
</MyTax>
Cependant, maintenant, je voudrais calculer stax séparément pour chaque élément, puis de la somme de ces éléments - c'est parce que dans l'exemple ci-dessus, je me retrouve avec des erreurs d'arrondi comme la somme de l'individu stax est en fait 714 - la valeur que je recherche, plutôt que de 715 ci-dessus.
La sortie, je suis à la recherche d'seraient:
<MyTax>
<item>
<Stax>357</Stax>
</item>
<item>
<Stax>357</Stax>
</item>
<TotalStax>714</TotalStax>
</MyTax>
Si je peux mettre en place pour chacun, comment dois-je calculer stax dans une variable, pour chaque passage, et puis résumer l'individu stax? Je suis limité XSLT 1.0, vu certaines réponses à l'aide des touches et nodesets mais je ne suis pas en mesure de comprendre comment les appliquer.
stax
est 714.78, qui vous ai demandé le processeur à la ronde. Cette tours à 715. Pourquoi voulez-vous 714 sortie?Jim, je me suis fait avoir à produire de l'714 somme - qui ne vient que par le calcul de la stax séparément dans chaque course (357) et en additionnant tous les stax - me donner 357+357 = 714 au lieu de 715 si je fais le calcul sur la somme des éléments individuels. Je suis incapable de créer le XSLT pour cette sortie requise...
OriginalL'auteur Surge | 2012-10-30
Vous devez vous connecter pour publier un commentaire.
Cette transformation XSLT 1.0:
lorsqu'il est appliqué sur le document XML fourni par le:
calcule les sommes de chaque
item
et produit le résultat voulu:Ne remarque que le
xxx:node-set()
fonction d'extension est nécessaire (cela peut être évité par l'utilisation de la récursivité).Il n'y a aucun moyen d'obtenir 714 -- le résultat réel est > 714.5
Ce que j'essayais d'obtenir de était ronde(4750 - 4750*0.08 + 2800 + 50) = round(357.39) = 357 pour chaque élément ci-dessus, puis somme (357, 357) = 714. Plutôt que de ce que j'avais déjà fait de la ronde(0.0495*(8740+5600+100)) = round(714.78) = 715 qui était incorrect pour mon application. En outre, la réduction est un param donc au lieu de 0,08 (8% de réduction), j'ai pu avoir 12% de rendement ronde(0.0495*(4750*0.88+2800+50)) = 348. Et en additionnant à 348+348 = 696. Dans votre xsl de la valeur du sol et, au lieu de devenir 695, si j'ai besoin de 696. Comment puis-je tour à chaque élément, puis additionner chaque résultat?
Vous avez besoin de modifier votre question et d'expliquer cette exigence-de forcer les gens à deviner les résultats des réponses.
Désolé je n'ai pas remarqué que j'avais décoché l'accepter. J'ai essayé de voter utile. @Dimitre, votre réponse me donne amplement, en direction d'une solution, de sorte qu'il est certainement utile. Je pensais que je l'avais précisé au début de ce que je suis en train de mettre par voie de sortie désirée, XML comme deux ensembles de Stax pour les éléments et enfin la TotalStax qui serait la simple somme de l'individu Stax. L'exemple XSL j'ai fourni a été pour ce que j'étais en train de faire, c'est à dire l'ajout de tout et puis le calcul de la tour(0.0495*....) , en précisant ce que je voudrais obtenir.
OriginalL'auteur Dimitre Novatchev