Skip navigation.

Welcome chez moi !

L'histoire d'une vie d'entrepreneur / développeur Web Multimédia

Posts tagged with "xslt"

Erreur xsl:decimal-format 80070057

,

Pour aider la communauté de développeur, voici une réponse concernant l'erreur 80070057 affichée lors d'une transformation XSL d'un document XML.

Pour vous mettre sur la piste, l'erreur provient de deux déclarations contradictoires concernant la mise en forme de données chiffrées à l'aide du tag <xsl:decimal-format>

En effet, la balise xsl:decimal-format permet de mettre en forme un chiffre selon différents paramètres. Cependant, l'appel à cette mise en forme ou son application sur une donnée, se fait à l'aide de la commande format-number()

Voici donc un code erroné provoquant la fameuse erreur que nous expliquerons après


Définition du format
<xsl:decimal-format name="financial" decimal-separator="." grouping-separator=" " NaN="-" infinity="-" />
Application du format sur $value
<xsl:value-of select="format-number($value,'# ##0,00','financial')" />



Dans le cas présent, l'erreur est provoquée par la déclaration contradictoire au niveau du séparateur décimal:
La définition du format défini que les décimales sont séparées par '.' tandis que l'appel à la mise en forme fait clairement apparaitre le caractère ',' dans sont format.

Pour corriger ce genre d'erreur, vérifiez bien que vos déclaration et appels n'utilisent pas de déclarations contradictoires.

Régler la précision d'un arrondi en XSLT / Set rounding accuracy in XSLT

Vous qui lisez ce message, il y a de forte chances que vous soyez en train de vous arracher les cheveux sur une transformation XSLT nécessitant un arrondi d'un float avec une certaine précision.

Pour ma part, j'ai été confronté à ce problème pour la mise en forme d'un flux XML de comptabilité et de statistiques commerciales... les chiffres après la virgules sont donc essentiels!

Or, si vous utilisez la, commune à tous les langages, fonction round(), vous déchanterez bien vite en vous apercevant que vous ne pouvez pas en régler la précision... et pour cause!
La fonction round arrondi bêtement à l'entier le plus proche... bref pi, à savoir 3,1416... deviendra 3, ou encore un calcul de TVA sera rapidement erroné, ce qui risque de mettre certaines entreprises peux scrupuleuses en controle fiscal.

Pour faire simple, avant on avait :
round(chiffre ou XPATH)


Maintenant, pour éviter le problème, c'est un peu plus lourd:
<!-- Déclare un formatage nommé 'financial' avec séparateur ',' pour les centièmes et ' ' entre les groupes de chiffre -->
<xsl:decimal-format name="financial" decimal-separator="," grouping-separator=" " />

<!-- Présente un chiffre avec une précision de 2, utilisant le caractère ' ' pour séparer les centaines selon le modèle 'financial' -->
format-number(valeur ou XPATH,'# ##0,00','financial')


Pour plus de détails, les '#' correspondent à n'importe quel chiffre et le 0 avant la virgule permet de spécifier, qu'en cas de chiffre inférieur à 1 (ex: 0,38), il faut afficher le '0' initial.
Sans cette petite précision, vous vous retrouverez avec ',38', ce qui peut être déroutant pour les utilisateurs.

En espérant que cette méthode d'arrondi sauve votre emploi et retarde votre calvitie naissante!

Read more...

La puissance du XSLT

,

Le langage XSLT est un langage s'appuyant sur des tags et permettant de mettre en forme, sous forme de code HTML (page web), un fichier XML.

Je travaille actuellement sur cette techno car je suis en mission chez un client pour lequel je dois concevoir un système de statistiques asser poussé.
J'ai donc choisi le format de sortie XML post-traitement, permettant différentes manipulations et mises en forme.
Il est à noter que le XSLT est limité puisqu'il s'agit d'un langage de programmation ultra basique basé sur des appels récursifs et non itératifs (pas de boucle FOR).
La boucle for-each est cependant implémentée mais vous n'avez aucune emprise dessus, pas moyen de contrôler de façon simple le nombre d'itération, afficher un élement sur deux ou autres.

Mon problème actuel est d'effectuer un tri sur la valeur d'un attribut d'un noeud

Le but du jeu serait d'afficher tous les noeuds LINE de type "P" avant ceux de type "N".
Je n'ai pas encore trouvé la requête XPATH qui va bien pour effectuer le tri.

Celà étant utile, dès que j'aurai trouvé une réponse, je la mettrai sur ce post.

-- Réponse --

Ne vous faites pas trop ch**r avec le XSLT, modifiez tout simplement la structure de votre XML. Si j'avais su avant que j'avais le droit, j'aurai gagné 3 jours de dev!

Read more...