使用xslt一起选择和格式化数字

时间:2015-01-29 19:19:37

标签: xslt xslt-1.0

我试图绑定一定范围内的整数并以十进制格式输出。我意识到它永远是.0,任何现代语言应该能够轻松地将整数转换为浮点数。但无论如何我都有责任这样做。

示例输入看起来类似于以下


<data guid="25abab12-cb0a-5f37-8a11-121be3a74959">
    <cork_id value="123456" valid="false"/>
    <name> David Moe </name>
    <is_bro>false</is_bro>
    <some_test_value> 200012000 </some_test_value>
    <standard_room_type> liquid </standard_room_type>    
    <environment> Groovy </environment>
</data >
<data guid="f5abab12-cb0a-5f37-8a11-121be3a74959">
    <cork_id value="123456" valid="false"/>
    <name> David Moe </name>
    <is_bro>false</is_bro>
    <some_test_value> 3 </some_test_value>
    <standard_room_type> liquid </standard_room_type>    
    <environment> Groovy </environment>
</data>
<data guid="a5abab12-cb0a-5f37-8a11-121be3a74959">
    <cork_id value="123456" valid="false"/>
    <name> David Moe </name>
    <is_bro>false</is_bro>
    <some_test_value> 250 </some_test_value>
    <standard_room_type> liquid </standard_room_type>    
    <environment> Groovy </environment>
</data >

预期输出将复制上面的xml,但将some_test_value元素更改为5和100范围内,并在末尾添加.0以使其成为浮点类型。
例如,

<some_test_value> 200012000 </some_test_value> 

会变成

<some_test_value> 500.0 </some_test_value>

和      3

会变成

<some_test_value> 5.0 </some_test_value>

最后      250

会变成

<some_test_value> 250.0 </some_test_value>

我对xslt的错误尝试将如下所示

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

<!--  This is the copy identity -->
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

   <xsl:template match ="//some_test_value/text()">
     <xsl:choose>
     <xsl:when test="//some_test_value/text()[. &gt; 500 ]">
     500.0
     </xsl:when>
       <xsl:when test="//some_test_value/text()[. &lt; 5 ]">
         5.0
       </xsl:when>
     <xsl:otherwise>
       <xsl:value-of select='format-number(".","#.0")'/>
     </xsl:otherwise>
     </xsl:choose>
   </xsl:template>
</xsl:stylesheet> 

1 个答案:

答案 0 :(得分:1)

尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="some_test_value">
    <xsl:copy>
        <xsl:choose>
            <xsl:when test=". &lt; 5">5.0</xsl:when>
            <xsl:when test=". > 500">500.0</xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="format-number(., '#.0')"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>