Domanda

Sono bloccato con un problema che sembra stupido, ma non riesco a trovare la soluzione ... Con XLST, ho bisogno di sommare un elenco di valori calcolati da un modello. Così ho conservato questi valori in una struttura ad albero (un elenco di elementi "numero" contenute in un elemento radice "Numeri"). Ma tutto quello che cerco di fare con questa lista self-made, verrà restituito o nulla, 0 o un errore ...

Qualcuno sa che cosa sto facendo male?

<!-- 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)"/>
È stato utile?

Soluzione

Ecco un modo veloce di come per riassumere i valori generati dinamicamente (probabilmente il modello che si sta chiamando non sta producendo i risultati attesi? Se è così, è necessario fare un'altra domanda e fornire sia il codice e il documento XML su cui opera il codice senza questi non si può aiutare e supposizioni non sarebbe 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>

Quando la trasformazione di cui sopra è applicato su qualsiasi documento XML (ignorato), il risultato voluto è prodotto :

3

Altri suggerimenti

La ricorsione è la solita risposta in linguaggi funzionali. Qualcosa di simile:

<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>

Senza sapere più GetSize e il documento di input è difficile essere più preciso circa il diritto XPath per impostare il nodo di contesto per la chiamata ricorsiva.

Nel mio caso ho avuto esattamente lo stesso problema che somma ($ qualcosa / elemento) ha restituito 0 e somma ($ qualcosa / *) ha restituito il valore corretto.

Il mio problema è stato causato dal seguente dichiarazione foglio di stile UBL fattura:

xmlns = "urn: Oasis: Nomi: specifica: OSAMA: schema: xsd: Fattura-2"

Dopo la rimozione di questa linea, somma ($ qualcosa / elemento) ha restituito il valore corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top