如何使用xslt提取数字的整数部分

时间:2012-10-18 12:24:59

标签: xslt xslt-1.0

我有这个xml文件:

 <pas>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>DOUBLE</type>
    <oper>HIGH</oper>
    <val1>103619.9</val1>
    <bId>2</bId>
  </rulepar>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <sumval1>-103.67</sumval1>
    <bId>3</bId>
  </rulepar>
 </pas><rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val1>10</val1>
    <bId>3</bId>
  </rulepar>
 </pas>

使用此xsl文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" xml:space="preserve"/>

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

<xsl:template match="val1|sumval1">  
    <val111><xsl:value-of select="."/></val111>
</xsl:template>

当我进行转换时,我得到了结果:

 <pas>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>DOUBLE</type>
    <oper>HIGH</oper>
    <val111>103619.9</val111>
    <bId>2</bId>
  </rulepar>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val111>-103.67</val111>
    <bId>3</bId>
  </rulepar>
 </pas><rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val111>10</val111>
    <bId>3</bId>
  </rulepar>
 </pas>

我通常期望这个输出:

 <pas>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>DOUBLE</type>
    <oper>HIGH</oper>
    <val111>103619</val111>
    <bId>2</bId>
  </rulepar>
  <rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val111>-103</val111>
    <bId>3</bId>
  </rulepar>
 </pas><rulepar>
    <name1>Hi</name1>
    <name2></name2>
    <type>Text</type>
    <oper>LOW</oper>
    <val111>10</val111>
    <bId>3</bId>
  </rulepar>
 </pas>

那么,如何在结果中仅获取数字103619.9的整数部分,如预期的输出文件所示?我想要一个解决方案,当数字只是一个十进制数时,也可以走路,如果这个数字是&lt; 0。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:5)

此XPath 1.0表达式可以获得数字的整数部分 - 无论数字是正数还是负数

floor(.)*(. >= 0)    +   ceiling(.) * not(. >= 0)

<强>解释

  1. 如果数字为正数,我们会使用floor()函数。

  2. 如果数字为负数,我们会使用ceiling()函数。

  3. 我们使用number(true()) = 1number(false()) = 0

  4. 这两个功能(上图)结合起来

    以下是完整示例

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="text()">
      <xsl:value-of select="floor(.)*(. >= 0) + ceiling(.) * not(. >= 0)"/>
      <xsl:text>&#xA;</xsl:text>
     </xsl:template>
    </xsl:stylesheet>
    

    将此转换应用于以下XML文档时:

    <t>
     <a>2.34</a>
     <b>-3.14</b>
    </t>
    

    产生了想要的正确结果

    2
    -3
    

答案 1 :(得分:2)

XPath floor()函数

  

计算十进制数并返回小于或等于十进制数的最大整数

如果值全部为正且XPath看起来像

,则

将起作用

<value111><xsl:value-of select="floor(number(.))"/></value111>

但是,如果值为-2.1,则无效,因为上述代码会导致-3

如果某个值有可能为负值,那么如果只有一个小数点,那么使用substring-before()函数将对正数和负数都有效。

<value111><xsl:value-of select="substring-before(., '.')"/></value111>

注意:不确定问题是否有拼写错误,但其中一个模板的匹配模式不正确。它应该是

<xsl:template match="val1|sumval1">

而不是

<xsl:template match="value1|sumval1"> 

答案 2 :(得分:1)

试试这个

<value111><xsl:value-of select="floor(number(.))"/></value111>