格式化数字或字符串与xml xslt样式表无法正常工作

时间:2013-05-24 14:32:58

标签: xml xslt xml-parsing xslt-2.0

我正在尝试轻松格式化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>  

1 个答案:

答案 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(.)">测试也应该这样做。