我有这个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。 谢谢你的帮助。
答案 0 :(得分:5)
此XPath 1.0表达式可以获得数字的整数部分 - 无论数字是正数还是负数:
floor(.)*(. >= 0) + ceiling(.) * not(. >= 0)
<强>解释强>:
如果数字为正数,我们会使用floor()
函数。
如果数字为负数,我们会使用ceiling()
函数。
我们使用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>
</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>