0

我正在尝试轻松格式化 xml 结构的输出

<items><item1><factor1><factor200><factor1desc><factor200descr></item1></items>

factor^n 到数字和 factor^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>  
4

1 回答 1

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

于 2013-05-24T16:02:22.427 回答