您好 作为XSL的初学者,几乎不知道几个命令。 我正在尝试一个示例,我必须根据XML中的条目格式化数字。 我想使用format-number函数来实现同样的目的。
<Details>
<Order>Bulk Order</Order>
<OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
<Quantity>100</Quantity>
<Price>99.45</Price>
<Format>de_DE</Format>
</Details>
<Details>
<Order>Bulk Order</Order>
<OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
<Quantity>100</Quantity>
<Price>99.45</Price>
<Format>en_US</Format>
</Details>
但是如果我使用的话,我可以渲染输出:
<xsl:value-of select='format-number(500100, "###,###.00")' />
但我想使用某种条件
即格式为de_DE: 我想将###。###,00传递给format-number方法(注意小数和千位分隔符) 或者格式是en_US 我想将###,###。00传递给format-number方法
我无望尝试使用choose语句(但我真的不知道使用语法)
<xslt:choose>
<xslt:when test="$format = 'de_DE'">###,###.00</xslt:when>
<xslt:when test="$format = 'en_US'">###.###,00</xslt:when>
<xslt:otherwise>###.###,00</xslt:otherwise>
</xslt:choose>
任何人都可以帮我把它放到模板或其他东西上,以便我打电话 的 我根据XML中的格式获得输出
由于 Srivatsa
答案 0 :(得分:4)
XSLT特别针对此案例<xsl:decimal-format>
指令。
这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:decimal-format name="de_DE" decimal-separator="." grouping-separator="," />
<xsl:decimal-format name="en_US" decimal-separator="," grouping-separator="."/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Price/text()">
<xsl:value-of select="format-number(., '#,###.##', ../../Format)"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档(包装到顶部元素节点中以使格式正确):
<t>
<Details>
<Order>Bulk Order</Order>
<OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
<Quantity>100</Quantity>
<Price>1199.45</Price>
<Format>de_DE</Format>
</Details>
<Details>
<Order>Bulk Order</Order>
<OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
<Quantity>100</Quantity>
<Price>1199.45</Price>
<Format>en_US</Format>
</Details>
</t>
产生想要的结果:
<t>
<Details>
<Order>Bulk Order</Order>
<OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
<Quantity>100</Quantity>
<Price>1,199.45</Price>
<Format>de_DE</Format>
</Details>
<Details>
<Order>Bulk Order</Order>
<OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
<Quantity>100</Quantity>
<Price>1199,45</Price>
<Format>en_US</Format>
</Details>
</t>
答案 1 :(得分:1)
您可以应用模板并匹配文本节点的值,如下所示:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:apply-templates select="/root/Details"/>
</xsl:template>
<xsl:template match="Details">
<xsl:variable name="total" select="Price * Quantity"/>
<xsl:apply-templates select="Format">
<xsl:with-param name="total" select="$total"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Format[text()='de_DE']">
<xsl:param name="total"/>
<xsl:value-of select="format-number($total, '###.###.00')"/>
</xsl:template>
<xsl:template match="Format[text()='en_US']">
<xsl:param name="total"/>
<xsl:value-of select="format-number($total, '###,###.00')"/>
</xsl:template>
此代码例如匹配所有详细信息节点,并为每个匹配获取订单的总数。然后,它在传递总数作为参数的格式上执行apply-template。然后匹配发生在格式节点的值上。
我认为格式'###。###。00'无效,因为似乎只允许一个小数点。 '###,###。00'很好。
答案 2 :(得分:0)
假设您在“详细信息”节点的模板匹配中,那么您可以执行以下操作:
<xslt:choose>
<xslt:when test="Format/text() = 'de_DE'"><xsl:value-of select="format-number(Price, '###,###.00')" /></xslt:when>
<xslt:when test="Format/text() = 'en_US'"><xsl:value-of select="format-number(Price, '###.###,00')" /></xslt:when>
<xslt:otherwise><xsl:value-of select='format-number(Price, "###.###,00")' /></xslt:otherwise>
</xslt:choose>
$ format适用于由&lt; xslt:variable /&gt; 定义的名为'format'的变量。测试条件接受XPath语句,如格式(详细信息的节点子节点)/ text()(格式的文本子节点)