我正在尝试轻松格式化xml结构的输出
<items><item1><factor1><factor200><factor1desc><factor200descr></item1></items>
将^ n设为数字,将因子^ ndesc设为字符串,但不起作用。我不想明确输入每个属性名称,这可以通过自动算法来完成吗?
<xsl:template match="/*/*/*">
<xsl:choose>
<xsl:when test="(number(/*/*/*))">
<!-- myNode is a not a number or empty(NaN) or zero -->
<Cell>
<Data ss:Type="String">
<xsl:value-of select="." />
</Data>
</Cell>
</xsl:when>
<xsl:otherwise>
<!-- myNode is a number (!= zero) -->
<Cell>
<Data ss:Type="Number">
<xsl:value-of select="format-number(.,'##,###.00')" />
</Data>
</Cell>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 0 :(得分:0)
我认为你想要
<xsl:template match="/*/*/*[. castable as xs:double and not(. = 0)]">
<Cell>
<Data ss:Type="Number">
<xsl:value-of select="format-number(., '##,###.00')"/>
</Data>
</Cell>
</xsl:template>
<xsl:template match="/*/*/*[not(. castable as xs:double) or . = 0]">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:template>
但是,如果您想编写一个模板,然后在模板中想要测试匹配的元素,请将<xsl:when test="(number(/*/*/*))">
更改为<xsl:when test=". castable as xs:double and not(. = 0)">
。
我不确定NaN是否转换为false但我现在已经检查过了,所以你的<xsl:when test="number(.)">
测试也应该这样做。