Pregunta

tengo este (un intento de resolver la tarea):

<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal">
  <xsl:output method="html" indent="no"/>
  <xsl:decimal-format NaN=""/>  
     <xsl:template match="/">
      <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>
        <xsl:value-of select="sum($Rows/@Distance[.!=''])" />

    </xsl:template>

</xsl:stylesheet>

El resultado es: "NaN", por lo que la figura que mi XSLT es erróneo.

La pregunta es: ¿Cómo se escribe el XSLT para calcular y mostrar la suma de todos los valores en la columna "Distancia" en un elemento Web Vista de datos? La columna puede tener valores vacíos (no tiene valores vacíos ahora por cierto) que se deben ignorar el cálculo de la suma.

Actualización 1:

<xsl:decimal-format grouping-separator="." decimal-separator="," NaN="" name="european"/>
<xsl:template match="/">

Prueba:

<xsl:copy-of
    select="format-number(sum(for ($i in /dsQueryResponse/Rows/Row/@Distance) { return number(replace($i, ',','.')})), '#,##', 'european')" />

probado este, pero se produce un error (Error procesador de hoja de estilo de ajuste. Esperaba ')' encontró 'NOMBRE'.

Actualización 2:

<xsl:template match="/">
    	xsum //Distance = <xsl:call-template name="xsum"><xsl:with-param name="currnode" select="//row/@Distance[1]"/></xsl:call-template>    		

    <xsl:template name="xsum">
        	<xsl:param name="currnode"/>
    	<xsl:param name="res" select="0"/>
    	<xsl:choose>
            		<xsl:when test="$currnode">
                			<xsl:call-template name="xsum">
                    			<xsl:with-param name="currnode" select="$currnode/following-sibling::tal[1]"/>
    		             		<xsl:with-param name="res" select="$res + translate($currnode,',','.')"/>
    		            	</xsl:call-template>
            		</xsl:when>
            		<xsl:otherwise>
                			<xsl:value-of select="translate($res,'.',',')"/>
            		</xsl:otherwise>
        	</xsl:choose>
    </xsl:template>

Tengo el XSLT indicados anteriormente y no proporcionar una salida, pero con los siguientes valores en la columna Distancia:

2 
3,5 
-1,3
0

Me conseguir un resultado diferente de NaN pero no la suma, sólo el primer valor de la medida de lo que puedo ver. El resultado es:. Xsum // Distancia = 2

Actualización 3:

Esto funciona. Tuvimos algunos problemas con la selección del nodo de inicio, sino que debe ser resuelto ahora.

<xsl:decimal-format name="da-DK" decimal-separator="," grouping-separator="." minus-sign="-" NaN="Ikke tal"/>

   <xsl:output method="html"/>      
    <xsl:template match="/"> 
        <xsl:text>Distance tilbagelagt = </xsl:text>        
        <xsl:call-template name="xsum">
            <xsl:with-param name="currnode" select="//Row[1]"/>
            <xsl:with-param name="attr-type" select="'Distance'"/>
            <xsl:with-param name="res" select="0"/>
        </xsl:call-template> km


    <xsl:template name="xsum"> 
        <xsl:param name="currnode"/>
        <xsl:param name="attr-type"/>
        <xsl:param name="res" select="0"/> 
        <xsl:choose> 
            <xsl:when test="$currnode/following-sibling::Row"> 
                <xsl:call-template name="xsum"> 
                    <xsl:with-param name="currnode" select="$currnode/following-sibling::Row[1]"/>
                    <xsl:with-param name="attr-type" select="$attr-type"/>
                    <xsl:with-param name="res" select="$res + number(translate($currnode/@*[name() = $attr-type],',','.'))"/> 
                </xsl:call-template> 
            </xsl:when> 
            <xsl:otherwise> 
                <xsl:value-of select="format-number($res + number(translate($currnode/@*[name() = $attr-type],',','.')), '#,##','da-DK')"/> 
            </xsl:otherwise> 
        </xsl:choose> 
    </xsl:template>

Otros consejos

Esto debería funcionar:

<xsl:value-of select="sum($Rows[string-length(@Distance) &gt; 0]/@Distance)" />

M.

Licenciado bajo: CC-BY-SA con atribución
scroll top