Frage

Ich bin mit einem Problem stecken, die dumm scheint aber ich kann die Lösung nicht herausfinden ... Mit XLST, ich brauche von einer Vorlage berechnet eine Liste von Werten zu summieren. So I diese Werte in einer Baumstruktur (eine Liste von „Number“ Elementen, die in einem Wurzelelement „Numbers“) gespeichert. Aber was auch immer ich versuche, mit dieser selbstgemachten Liste zu tun, es wird wieder entweder nichts, 0 oder einen Fehler ...

Hat jemand weiß, was ich falsch mache?

<!-- 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)"/>
War es hilfreich?

Lösung

Hier ist eine schnelle Art und Weise, wie dynamisch generierten Werte zu summieren (Wahrscheinlich ist die Vorlage, die Sie anrufen, ist nicht die erwarteten Ergebnisse produzieren? Wenn ja, müssen Sie eine andere Frage stellen und bieten sowohl den Code und das XML-Dokument, auf dem der Code arbeitet Ohne diese kann niemand helfen und Vermutungen wäre nicht sinnvoll sein):..

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

Wenn die obige Transformation auf jedem XML-Dokument (ignoriert) angewandt wird, wird das gewünschte Ergebnis erzeugt :

3

Andere Tipps

Rekursion ist die übliche Antwort in funktionalen Sprachen. So etwas wie:

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

Ohne mehr von GetSize zu wissen, und dem Eingabedokument es schwierig ist, präziser über die richtige XPath zu dem Kontextknoten für den rekursiven Aufruf zu setzen.

In meinem Fall hatte ich genau das gleiche Problem, dass Summe ($ etwas / Element) ergab 0 und Summe ($ etwas / *) zurück den richtigen Wert.

Mein Problem durch die folgende UBL Rechnung Stylesheet-Deklaration verursacht wurde:

xmlns = "urn: Oase: Namen: Spezifikation: UBL: schema: xsd: Rechnung-2"

Nach dem Löschen der Zeile, Summe ($ etwas / Element) zurück der richtige Wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top