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

Fra*_* N. 2 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>
Run Code Online (Sandbox Code Playgroud)

使用此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>
Run Code Online (Sandbox Code Playgroud)

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

 <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>
Run Code Online (Sandbox Code Playgroud)

我通常期望这个输出:

 <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>
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*hev 5

此XPath 1.0表达式为您提供数字的整数部分 - 无论数字是正数还是负数:

floor(.)*(. >= 0)    +   ceiling(.) * not(. >= 0)
Run Code Online (Sandbox Code Playgroud)

说明:

  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>
Run Code Online (Sandbox Code Playgroud)

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

<t>
 <a>2.34</a>
 <b>-3.14</b>
</t>
Run Code Online (Sandbox Code Playgroud)

产生了想要的正确结果:

2
-3
Run Code Online (Sandbox Code Playgroud)