2

我有这个 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 的整数部分,如预期的输出文件中所示?我想要一个解决方案,当数字只是一个十进制数字并且这个数字<0时也可以走。谢谢你的帮助。

4

3 回答 3

5

这个 XPath 1.0 表达式为您提供数字的整数部分——无论数字是正数还是负数

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

说明

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

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

  3. 我们使用以下事实将这两个函数(上面)结合起来,number(true()) = 1并且number(false()) = 0

这是一个完整的例子

<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
于 2012-10-18T13:35:52.360 回答
2

XPathfloor()函数

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

如果这些值都是正数并且 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"> 
于 2012-10-18T13:01:24.673 回答
1

试试这个

<value111><xsl:value-of select="floor(number(.))"/></value111>
于 2012-10-18T13:15:15.730 回答