在片段下面输出给定序列中缺少的数字。它适用于小数,但不适用于科学记数法(即1.6646144E7)。 如何解决这个问题?
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:template match="/">
<xsl:variable name="OriginalSequence">16646145 1.6646144E7 16646149 1.6646148E7 16646151 1.664615E7 16646163 1.6646162E7</xsl:variable>
<!--<xsl:variable name="OriginalSequence">1 2 8 2 3</xsl:variable>-->
<xsl:variable name="seq1" as="xs:integer*" select="for $s in $OriginalSequence/tokenize(normalize-space(.), '\s+') return xs:integer($s)"/>
<xsl:variable name="seq2" as="xs:integer*" select="min($seq1) to max($seq1)"/>
<xsl:variable name="seq3" as="xs:integer*" select="$seq2[not(. = $seq1)]"/>
<missing><xsl:value-of select="$seq3"/></missing>
</xsl:template>
所需的输出:
<missing>16646145 16646146 16646147 16646152 16646153 16646154 16646155 16646156 16646157 16646158 16646159 16646160 16646161</missing>
变量originalSequence是我原来的xslt中算术运算的输出,我不确定我是否可以告诉xslt2.0不要转换成科学记数法?
答案 0 :(得分:1)
作为示例中的修正,您可以使用xs:integer(xs:double($s))
代替直接尝试xs:integer($s)
。但是,如果您的真实代码首先创建xs:double
而不是xs:integer
,那么您可能只需更改该代码即可创建整数。这取决于您拥有和尚未共享的代码。
答案 1 :(得分:0)
我不确定我是否可以告诉xslt2.0不要转换为科学 符号
是的,你可以使用format-number()函数来获得你想要的格式。对于1e-6到1e + 6范围之外的数字,默认的数字到字符串转换使用指数表示法。