首页 > 解决方案 > 需要为 XSL 模板的变量添加逗号

问题描述

我正在尝试在从我们的客户信息系统打印的账单中添加一个逗号。据我了解,该应用程序从 sql server 中提取客户的数据并创建一个 xml 文件。然后将该 xml 文件与 xsl 文件进行比较以进行格式化,并创建一个新的 xml 文件和 pdf。

我对 xml 了解不多,但据我所知,@previousread、@current 和 @usage 是从我们应用程序的 xml 流中解释的变量。这三个变量分别代表上一次抄表、当前抄表和消耗(使用)。

我的组织希望我为数千人添加逗号。在这篇文章中,我们的账单只是将一堆数字放在一起。我看不出数字的外观有问题,也看不出我们为什么需要逗号,但我希望它有逗号。

我不是网络开发人员,但我对 sql server 有一点经验。我花了大约 8 个小时来解决这个问题,并认为我发现它只是为了看到 pdf 没有逗号。

我已经在网上看到了如何格式化一个数字的例子,当它是一个常数值但每个仪表读数的值不同时,我不知道如何弥补这一点。

我已经按原样发布了代码,并且我已经对其进行了编辑。

这是原始代码。

<fo:table-cell text-align="left" padding-left="10pt">
<fo:block border-right-style="solid" border-color="black" border-width="0.2pt">
<xsl:value-of select="@utility"/>
</fo:block>
</fo:table-cell>
<xsl:if test="count(meter/meterread) &gt; 0">
<fo:table-cell text-align="center" border-right-style="solid" border-color="black" border-width="0.2pt">
<fo:block>
<xsl:value-of select="descendant::meter/meterread[1]/@previousread"/>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center" border-right-style="solid" border-   color="black" border-width="0.2pt">
<fo:block>
<xsl:value-of select="descendant::meter/meterread[last()]/@current"/>
</fo:block>
</fo:table-cell>   
<fo:table-cell text-align="center" border-right-style="solid" border-  color="black" border-width="0.2pt">
<fo:block>
<xsl:choose>
<xsl:when test="string-length(meter/meterread/@billingusage) &gt; 0">
<xsl:value-of select="sum(meter/meterread/@billingusage)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="sum(meter/meterread/@usage)"/>
</xsl:otherwise>
</xsl:choose>
</fo:block>
</fo:table-cell> 

这是我编辑过的代码。

<fo:table-cell text-align="left" padding-left="10pt">
<fo:block border-right-style="solid" border-color="black" border-width="0.2pt">
<xsl:value-of select="@utility"/>
</fo:block>
</fo:table-cell>
<xsl:if test="count(meter/meterread) &gt; 0">
<fo:table-cell text-align="center" border-right-style="solid" border-color="black" border-width="0.2pt">
<fo:block>
<xsl:value-of select="descendant::meter/meterread[1]/@previousread"/>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center" border-right-style="solid" border-color="black" border-width="0.2pt">
<fo:block>
<xsl:value-of select="descendant::meter/meterread[last()]/@current"/>
</fo:block>
</fo:table-cell>   
<fo:table-cell text-align="center" border-right-style="solid" border-color="black" border-width="0.2pt">
<fo:block>
<xsl:choose>
<xsl:when test="string-length(meter/meterread/@billingusage) &gt; 0">
<xsl:value-of select="sum(meter/meterread/@billingusage)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="sum(meter/meterread/@usage)"/>
</xsl:otherwise>
</xsl:choose>
</fo:block>
</fo:table-cell> 

标签: xml

解决方案


您可以使用该函数将带有逗号的数字格式化为千位分隔符format-number():只需在任何参考资料中查找即可。我不知道你想在哪里使用它,也许是在调用sum().

顺便说一句,您的样式表中有一些奇怪的代码。

<xsl:when test="string-length(meter/meterread/@billingusage) &gt; 0">
  <xsl:value-of select="sum(meter/meterread/@billingusage)"/>
</xsl:when>

如果meter/meterread/@billingusage是一个包含多个值的集合,那么应用它是没有意义的string-length();如果它是一个单一的值,那么应用它是没有意义的sum()

表达式@previousread@current@usage不引用变量,它们引用源文档中的属性。

8 小时足以阅读大量内容,所以我很惊讶您没有找到该format-number()功能。


推荐阅读