如何使用 Xslt 中的条件对循环中的值求和
How to sum values in a loop with conditions in Xslt
我需要一些帮助,我需要转换这个文件,但我有这样的情况:当 QTY > 0 且 QTY < 1 时,我应该替换为 1,最后对所有值求和
我有这个XML:
<?xml version="1.0" encoding="UTF-8" ?>
<DellistDocument>
<DELLIST>
<QTY>3.50</QTY>
</DELLIST>
<DELLIST>
<QTY>0.002</QTY>
</DELLIST>
<DELLIST>
<QTY>0.80</QTY>
</DELLIST>
</DellistDocument>
我需要为每个 QTY 循环并在变换映射中根据需要更改值,我需要像这样求和:
<QTY>3.50</QTY> ----> value = 3.50
<QTY>0.002</QTY> ----> value = 1
<QTY>0.80</QTY> ----> value = 1
Total Sum = 5.50
我试过这个,但我真的不知道该怎么做:
<xsl:variable name="QTYItem">
<xsl:for-each select="$Dellist">
<xsl:variable name="QTYCountItemValue" select="number(normalize-space(QTY/text()))" />
<xsl:variable name="QTYItemValidateValue">
<xsl:choose>
<xsl:when test="$QTYCountItemValue > 0 and $QTYCountItemValue < 1">
<xsl:value-of select="number(1)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="number($QTYCountItemValue)" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="sum($QTYItemValidateValue)" />
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$QTYItem" />
结果是:3.5011,这是放置循环值,但我需要求和,我该怎么做?我预计结果是 5.50
我正在使用 XSLT 3.0
非常感谢。
这里有一种方法可以做到这一点。
可能有更简单的方法...
不确定您需要的输出是什么,但您可以根据需要修改输出格式。
<?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:my="http://www.my.com"
exclude-result-prefixes="xs my"
version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="DellistDocument">
<xsl:copy>
<xsl:apply-templates/>
<TOTAL><xsl:value-of select="my:total(DELLIST[1],0)"/></TOTAL>
</xsl:copy>
</xsl:template>
<xsl:template match="QTY[number(.)>0 and number(.)<1]">
<xsl:copy>
<xsl:value-of select="1"/>
</xsl:copy>
</xsl:template>
<!-- Recursive function to round the numbers and add them -->
<xsl:function name="my:total" as="xs:double">
<xsl:param name="currDELLIST"/>
<xsl:param name="total"/>
<xsl:variable name="currQTY" select="($currDELLIST/QTY)[1]"/>
<xsl:variable name="round" select="if($currQTY>0 and $currQTY<1) then 1 else $currQTY"/>
<xsl:sequence select="if($currDELLIST/following-sibling::DELLIST)
then my:total($currDELLIST/following-sibling::DELLIST, $round+$total)
else $round+$total"/>
</xsl:function>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
无需循环即可对值求和。在这里你可以简单地做:
XSLT 2.0
<xsl:template match="/DellistDocument">
<output>
<xsl:value-of select="sum(DELLIST/(if (number(QTY) gt 0 and number(QTY) lt 1) then 1 else number(QTY)))"/>
</output>
</xsl:template>
我需要一些帮助,我需要转换这个文件,但我有这样的情况:当 QTY > 0 且 QTY < 1 时,我应该替换为 1,最后对所有值求和
我有这个XML:
<?xml version="1.0" encoding="UTF-8" ?>
<DellistDocument>
<DELLIST>
<QTY>3.50</QTY>
</DELLIST>
<DELLIST>
<QTY>0.002</QTY>
</DELLIST>
<DELLIST>
<QTY>0.80</QTY>
</DELLIST>
</DellistDocument>
我需要为每个 QTY 循环并在变换映射中根据需要更改值,我需要像这样求和:
<QTY>3.50</QTY> ----> value = 3.50
<QTY>0.002</QTY> ----> value = 1
<QTY>0.80</QTY> ----> value = 1
Total Sum = 5.50
我试过这个,但我真的不知道该怎么做:
<xsl:variable name="QTYItem">
<xsl:for-each select="$Dellist">
<xsl:variable name="QTYCountItemValue" select="number(normalize-space(QTY/text()))" />
<xsl:variable name="QTYItemValidateValue">
<xsl:choose>
<xsl:when test="$QTYCountItemValue > 0 and $QTYCountItemValue < 1">
<xsl:value-of select="number(1)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="number($QTYCountItemValue)" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="sum($QTYItemValidateValue)" />
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$QTYItem" />
结果是:3.5011,这是放置循环值,但我需要求和,我该怎么做?我预计结果是 5.50
我正在使用 XSLT 3.0
非常感谢。
这里有一种方法可以做到这一点。 可能有更简单的方法...
不确定您需要的输出是什么,但您可以根据需要修改输出格式。
<?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:my="http://www.my.com"
exclude-result-prefixes="xs my"
version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="DellistDocument">
<xsl:copy>
<xsl:apply-templates/>
<TOTAL><xsl:value-of select="my:total(DELLIST[1],0)"/></TOTAL>
</xsl:copy>
</xsl:template>
<xsl:template match="QTY[number(.)>0 and number(.)<1]">
<xsl:copy>
<xsl:value-of select="1"/>
</xsl:copy>
</xsl:template>
<!-- Recursive function to round the numbers and add them -->
<xsl:function name="my:total" as="xs:double">
<xsl:param name="currDELLIST"/>
<xsl:param name="total"/>
<xsl:variable name="currQTY" select="($currDELLIST/QTY)[1]"/>
<xsl:variable name="round" select="if($currQTY>0 and $currQTY<1) then 1 else $currQTY"/>
<xsl:sequence select="if($currDELLIST/following-sibling::DELLIST)
then my:total($currDELLIST/following-sibling::DELLIST, $round+$total)
else $round+$total"/>
</xsl:function>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
无需循环即可对值求和。在这里你可以简单地做:
XSLT 2.0
<xsl:template match="/DellistDocument">
<output>
<xsl:value-of select="sum(DELLIST/(if (number(QTY) gt 0 and number(QTY) lt 1) then 1 else number(QTY)))"/>
</output>
</xsl:template>