Умножение двух переменных в XSLT-1 - PullRequest
0 голосов
/ 09 октября 2019

Я пытался часами умножить 2 вариабеля в XSLT1, но я не могу понять это. Результат показывает в Excel как NaN
Я искал некоторое время, но у меня возникли проблемы с этим, только что начал использовать XSLT

Переменные:

  • Вес = 10
  • Длина = 12

XSLT:

<xsl:variable name ="content"><xsl:value-of select="$length * $weight" /></xsl:variable>

РЕДАКТИРОВАТЬ:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rvmon="rosenbergverft.com:3D/2017/WeightMTO" xmlns:pdms="rosenbergverft.com:3D/2010/Models">
  <xsl:output method="text" omit-xml-declaration="yes" standalone="no" media-type="text/xls" />
  <xsl:decimal-format name="euro" decimal-separator="," grouping-separator="." />

  <xsl:template match="/">Building block;Discipline;Area;Sub. Area;Syst. no.;Weight Item no.;Piecemark no.;Weight Item Descr.;CompType;Type code;Rating or Scedule;Spec.;Dim. (");Material;Cost Code COR;Weight Phase Code;Mod. Phase Code;Weight Status % (allow.);Mod. Constr. Code;Mod. Handl. Code;No. off;Unit Length/ Area (m,m2, m3);Unit Weight (kg/m, m2, m3);Unit Weight MON(kg/m, m2, m3);Net Dry Weight (kg);Gross Dry Weight (kg);Content Weight (kg);Installed weight;CoG East;CoG North;CoG Elevation;Ref. doc., dwg., P&amp;ID etc.;Remarks;Cost for instrument valves [NOK];install code;MON Lift Code;Paint Surface;Insulation Class;
<xsl:for-each select="/rvmon:WeightMTO/rvmon:MTOOwner"><xsl:for-each select="rvmon:Piecemark/rvmon:WeightItemNo/rvmon:Part">


<xsl:variable name= "weight" select="format-number(rvmon:ContentWeight/@number, '#0,0##', 'euro')"  />
<xsl:variable name="length"><xsl:choose><xsl:when test="contains(rvmon:CompType,'BOLT')"><xsl:text> 1 </xsl:text></xsl:when><xsl:when test="rvmon:UnitLength/@unit = 'mm'"><xsl:value-of select="format-number(rvmon:UnitLength/@number div 1000, '#0,0##', 'euro')" /></xsl:when><xsl:when test="rvmon:UnitLength/@unit = 'mm2'"><xsl:value-of select="format-number(rvmon:UnitLength/@number div 1000000, '#0,0##', 'euro')" /></xsl:when><xsl:when test="rvmon:UnitLength/@unit = 'mm3'"><xsl:value-of select="format-number(rvmon:UnitLength/@number div 1000000000, '#0,0##', 'euro')" /></xsl:when><xsl:otherwise><xsl:value-of select="format-number(rvmon:UnitLength/@number, '#0,0##', 'euro')" /></xsl:otherwise></xsl:choose></xsl:variable>
<xsl:variable name="content" select="$length * $weight" />


<xsl:value-of select="../../../rvmon:BuildingBlock" />;<xsl:value-of select="rvmon:Discipline" />;<xsl:value-of select="../../../rvmon:Module" />;<xsl:value-of select="../../../rvmon:SubArea" />;<xsl:value-of select="../../../rvmon:SystNo" />;<xsl:value-of select="rvmon:WeightItemNo" />;<xsl:value-of select="rvmon:Piecemark" />;<xsl:value-of select="rvmon:WeightItemDescr" />;<xsl:value-of select="rvmon:CompType" />;<xsl:value-of select="rvmon:TypeCode" />;<xsl:value-of select="rvmon:Rating" />;<xsl:value-of select="rvmon:Spec" />;<xsl:choose><xsl:when test="rvmon:Discipline = 'L'"><xsl:value-of select="format-number(rvmon:Dim/@number, '#0,##', 'euro')" /><xsl:choose><xsl:when test="rvmon:Dim/@unit = 'inch'">"</xsl:when><xsl:otherwise><xsl:value-of select="rvmon:Dim/@unit" /></xsl:otherwise></xsl:choose></xsl:when><xsl:when test="rvmon:Discipline = 'N'"></xsl:when><xsl:otherwise><xsl:value-of select="format-number(rvmon:Dim/@number, '#0,##', 'euro')" /><xsl:value-of select="rvmon:Dim/@unit" /></xsl:otherwise></xsl:choose>;<xsl:value-of select="rvmon:Material" />;<xsl:value-of select="rvmon:CostCodeCOR" />;<xsl:value-of select="rvmon:WeightPhaseCode" />;<xsl:value-of select="rvmon:ModPhaseCode" />;<xsl:value-of select="format-number(rvmon:WeightStatus/@number * 100, '00', 'euro')" />%;<xsl:value-of select="rvmon:ModConstrCode" />;<xsl:value-of select="rvmon:ModHandlCode" />;<xsl:value-of select="format-number(rvmon:NoOff/@number, '#0,###', 'euro')" />;<xsl:value-of select="$length"/>;<xsl:if test="rvmon:ModHandlCode = 'RP'">-</xsl:if><xsl:value-of select="format-number(rvmon:UnitWeight/@number, '#0,0##', 'euro')" />;<xsl:if test="rvmon:ModHandlCode = 'RP'">-</xsl:if><xsl:value-of select="format-number(rvmon:MONUnitWeightFactor/@number, '#0,0#####', 'euro')" />;<xsl:choose><xsl:when test="contains(rvmon:CompType,'BOLT')"><xsl:text> 1 </xsl:text></xsl:when><xsl:otherwise><xsl:value-of select="format-number(rvmon:NetDryWeight/@number, '#0,0##', 'euro')" /></xsl:otherwise></xsl:choose>;<xsl:value-of select="format-number(rvmon:AllowanceWeight/@number, '#0,0##', 'euro')" />;<xsl:if test="rvmon:ModHandlCode = 'RP'">-</xsl:if><xsl:value-of select="$weight"/>;<xsl:if test="rvmon:ProdStatus ='ABC' "><xsl:text> Yes </xsl:text></xsl:if>;<xsl:value-of select="format-number(rvmon:CoGEast/@number div 1000, '#0,0##', 'euro')" />;<xsl:value-of select="format-number(rvmon:CoGNorth/@number div 1000, '#0,0##', 'euro')" />;<xsl:value-of select="format-number(rvmon:CoGElevation/@number div 1000, '#0,0##', 'euro')" />;<xsl:value-of select="../../../rvmon:DrawNumber" />;<!-- xsl:value-of select="rvmon:Remarks" / --><xsl:value-of select="../../../pdms:PDMSElement/pdms:ElementName/@text" />;;;;<xsl:value-of select="format-number(rvmon:PaintSurface/@number div 1000000, '#0,0##', 'euro')" />;<xsl:value-of select="../../../rvmon:InsulationClass" />;<xsl:value-of select="$length"/>;<xsl:value-of select="$content"/><xsl:text>&#xa;</xsl:text></xsl:for-each> 
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

XML-документ

          <UnitLength number="1.000" unit="pcs" field="Quantity" />
          <ContentWeight number="8.005" unit="kg" field="ContentWeight" /> />

Я могу вывести "вес" и "длину" отдельно. Но я даже не могу сделать "вес * 10"

Извините, если это грязно.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Вам нужно удалить все числа форматирования при назначении переменной, а при умножении результата нужно отформатировать число, как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:rvmon="rosenbergverft.com:3D/2017/WeightMTO" 
    exclude-result-prefixes="#all"
    version="1.0">

    <xsl:decimal-format name="euro" decimal-separator="," grouping-separator="." />

  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
        <xsl:variable name= "weight" select="//rvmon:ContentWeight/@number"  />
        <xsl:variable name="length">
            <xsl:choose>
                <xsl:when test="contains(//rvmon:CompType,'BOLT')">
                    <xsl:text>1</xsl:text>
                </xsl:when>
                <xsl:when test="rvmon:UnitLength/@unit = 'mm'">
                    <xsl:value-of select="//rvmon:UnitLength/@number div 1000" />
                </xsl:when>
                <xsl:when test="rvmon:UnitLength/@unit = 'mm2'">
                    <xsl:value-of select="//rvmon:UnitLength/@number div 1000000" />
                </xsl:when>
                <xsl:when test="rvmon:UnitLength/@unit = 'mm3'">
                   <xsl:value-of select="//rvmon:UnitLength/@number div 1000000000" />
                </xsl:when>
                <xsl:otherwise>
                   <xsl:value-of select="//rvmon:UnitLength/@number" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:variable name="content" select="format-number(($weight * $length), '#0,0##', 'euro')" />
        <xsl:value-of select="$content"/>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 09 октября 2019

У вас есть:

<xsl:variable name= "weight" select="format-number(rvmon:ContentWeight/@number, '#0,0##', 'euro')"  />

Число, отформатированное для использования десятичной запятой, больше не является числом для целей XPath / XSLT. число может содержать только цифры и десятичный период.

Предполагая, что исходные значения (не показанные в вашем вопросе) являются истинными числами, используйте их для умножения и форматируйте их только для выходных данных.

...