Question

Je suis coincé avec un problème qui semble stupide mais je ne peux pas trouver la solution ... Avec XLST, je dois résumer une liste de valeurs calculées par un modèle. Donc, j'emmagasinés ces valeurs dans une structure arborescente (une liste d'éléments « Numéro » contenus dans un élément racine « Numbers »). Mais tout ce que j'essaie de faire avec cette liste self-made, il retournera soit rien, 0 ou une erreur ...

Quelqu'un sait ce que je fais mal?

<!-- create the tree fragment -->
<xsl:variable name="_subTotals">
    <Numbers>
        <xsl:for-each select="List">
            <xsl:variable name="_Size">
                <xsl:call-template name="GetSize">
                    <xsl:with-param name="_value" select="@value"/>
                </xsl:call-template>
            </xsl:variable>
            <Number>
                <xsl:value-of select="$_Size"/>
            </Number>
        </xsl:for-each>
    </Numbers>
</xsl:variable>

<!-- this returns an error: expression must result into a node-set -->
<xsl:message terminate="no">
    <xsl:value-of select="sum($_subTotals/Numbers/Number)"/>
</xsl:message>

<!-- transform the tree fragment into a node-set
<xsl:variable name="_Total" select="msxsl:node-set($_subTotals)"/>

<!-- returns nothing -->
<xsl:for-each select="$_Total/Numbers/Number">
    <xsl:message terminate="no">
        <xsl:value-of select="@value"/>
    </xsl:message>
</xsl:for-each>

<!-- returns 0 -->
<xsl:value-of select="sum($_Total/Numbers/Number)"/>
Était-ce utile?

La solution

Voici un moyen rapide comment additionner des valeurs générées dynamiquement (probablement le modèle que vous appelez ne produit pas les résultats escomptés? Si oui, vous devez poser une autre question et fournir à la fois le code et le document XML sur lequel le code fonctionne sans ceux-ci ne peut aider et suppositions ne serait pas utile):..

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 >
 <xsl:output method="text"/>

    <xsl:template match="/">
      <xsl:variable name="vrtfNums">
         <nums>
           <num>1</num>
           <num>2</num>
         </nums>
      </xsl:variable>

      <xsl:variable name="vNums" select="ext:node-set($vrtfNums)"/>

      <xsl:value-of select="sum($vNums/*/*)"/>
    </xsl:template>
</xsl:stylesheet>

Lorsque la transformation ci-dessus est appliquée sur tout document XML (ignoré), le résultat recherché est produit :

3

Autres conseils

récursivité est la réponse habituelle dans les langages fonctionnels. Quelque chose comme:

<xsl:template name='totalRest>
  <xsl:variable nane='sub'>
    <!-- Use for-each to set local new context node -->
    <xsl:for-each select='following::List[1]'>
      <xsl:call-template name='totalRest'/>
    </xsl:for-each>
  </xsl:variable>
  <xsl:variable name='this'>
    <xsl:call-template name="GetSize">
      <xsl:with-param name="_value" select="@value"/>
    </xsl:call-template>
  </xsl:variable>

  <xsl:value-of select='$sub+$this' />

</xsl:template>

Sans savoir plus GetSize et le document d'entrée, il est difficile d'être plus précis sur le droit XPath pour définir le nœud de contexte pour l'appel récursif.

Dans mon cas, j'ai eu exactement le même problème que somme (quelque chose / élément $) est revenu 0 et somme ($ quelque chose / *) retourne la valeur correcte.

Mon problème a été causé par la LBM suivante Déclaration sur facture stylesheet:

xmlns = "urn: oasis: names: Spécification: UBL: schéma: xsd: Facture-2"

Après avoir retiré cette ligne, somme (quelque chose / élément $) retourné la valeur correcte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top