我正在尝试根据传入的数据显示不同的信息。如果它是一个整数,我想只显示数字,如果它是小数,我想使用0.00#pattern。雅,我知道,有点混乱,但那是开发规范。产品:>
我有这个特定部分的以下XSL,但我看不到超过xsl:when错误消息
“预期结束表达 “浇注”。号码(SAVG) - > castable < - as xs:decimal“
<xsl:choose>
<xsl:when test="number(SAVG) > 0">
<xsl:choose>
<xsl:when test="number(SAVG) castable as xs:decimal">
<xsl:value-of select="format-number(SAVG, '###,###,##0.00#')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number(SAVG, '###,###,##0.###')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="number(SAVG) = 0">
<xsl:text disable-output-escaping="yes">&lt;</xsl:text>1
</xsl:when>
<xsl:otherwise>N/A</xsl:otherwise>
</xsl:choose>
我试着寻找/寻找答案,我尝试了“实例”,我尝试过使用xsl:if等,但我似乎无法让它工作。任何帮助将不胜感激。
感谢。
来自评论:
是的,我们使用的是1.0。对不起,我很抱歉 新的XSL处理,我该怎么做 粘贴你的XSL和输入来生成 HTML?
答案 0 :(得分:6)
<强>予。 XSLT 1.0 :
XSLT 1.0使用的XPath 1.0数据模型中没有xs:integer和xs:decimal。
以下是您可以使用的代码段:
<xsl:choose>
<xsl:when test="not(floor(SAVG) = SAVG)">
<xsl:value-of select="format-number(SAVG, '###,###,##0.00#')"/>
</xsl:when>
<xsl:otherwise> <!-- Integer value -->
<xsl:value-of select="SAVG"/>
</xsl:otherwise>
</xsl:choose>
请注意:要测试数值是否为整数,我们使用以下测试:
floor($someNum) = $someNum
以下是一种方法:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:sequence select=
"for $num in (3, 3.14)
return
if($num instance of xs:integer)
then ($num, ' is xs:integer', '
')
else if($num instance of xs:decimal)
then ($num, ' is xs:decimal', '
')
else ($num, ' is something else', '
')
"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于任何XML文档(未使用)时,会生成所需的正确结果:
3 is xs:integer
3.14 is xs:decimal
或者,根据您的示例使用format-number()
函数:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:sequence select=
"for $num in (3, 3.14)
return
if($num instance of xs:integer)
then (format-number($num, '###,###,##0.###'), '
')
else if($num instance of xs:decimal)
then (format-number($num, '###,###,##0.00#'), '
')
else ()
"/>
</xsl:template>
</xsl:stylesheet>
<强>产生强>:
3
3.14
答案 1 :(得分:0)
这个XSLT 1.0样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="test">
<xsl:choose>
<!-- Not number or number less than zero -->
<xsl:when test="0 > SVGA or number(SVGA) != SVGA">
<xsl:text>N/A</xsl:text>
</xsl:when>
<!-- Number zero -->
<xsl:when test="SVGA = 0">
<xsl:text><1</xsl:text>
</xsl:when>
<!-- Integer number -->
<xsl:when test="floor(SVGA) = SVGA">
<xsl:value-of select="format-number(SVGA,'###,###,##0.###')"/>
</xsl:when>
<!-- Double number -->
<xsl:otherwise>
<xsl:value-of select="format-number(SVGA,'###,###,##0.00#')"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
使用此输入:
<root>
<test>
<SVGA>0</SVGA>
</test>
<test>
<SVGA>12131</SVGA>
</test>
<test>
<SVGA>123.5654</SVGA>
</test>
<test>
<SVGA>-12.1</SVGA>
</test>
<test>
<SVGA>-7528</SVGA>
</test>
<test>
<SVGA>zero</SVGA>
</test>
</root>
输出:
<1
12,131
123.565
N/A
N/A
N/A
编辑3 :更好的测试顺序(加上Dimitre的表达式),更好的测试用例,更接近提问者的输入样本。