引起NAN XSLT的百分比

时间:2012-09-28 20:02:56

标签: xml xslt xpath xml-parsing xslt-1.0

我正在尝试使用XSLT 1.0解析文档以插入数据库,我注意到一个问题,即任何时候我有一个%值,它将返回“NaN”而不是实际值。我找不到这个问题的任何地方

来源:

<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="NaNValues.xsl" ?>
<items>
    <item>10%</item> 
</items>

模板:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output omit-xml-declaration="no" method="xml" indent="yes" version="1.0"/>

<xsl:template match="items">
 <xsl:for-each select="item">
  <xsl:call-template name="IsNaN"/>
 </xsl:for-each>
</xsl:template>

<xsl:template name="IsNaN">
 <MyItem>
   <xsl:variable name="myItem" select="item" />
   <xsl:value-of select="$myItem"/>
 </MyItem>
</xsl:template>
</xsl:stylesheet>

输出:

<MyItem>NaN</MyItem>

我尝试了以下内容:

substring($myItem,1,2)
substring($myItem,1,3)
concat($myItem,'')
string($myItem)

我遇到的主要问题是如何处理输入文件中的百分比符号。

3 个答案:

答案 0 :(得分:2)

我没看到这段代码如何产生NaN。它没有做任何算术,这是NaN总是来自的地方。当我运行它时,它产生了这个:

<?xml version="1.0" encoding="UTF-8"?>
<MyItem/>

请检查您是否正在运行您说正在运行的代码,如果它确实给了NaN,请告诉我们您如何运行它的详细信息(例如,哪个处理器以及如何调用)。

代码显然是无意义的 - 使用“item”元素作为上下文节点调用模板isNaN,并尝试查找名为“item”的上下文节点的子节点,当然也没有这样的子节点。但那不应该返回任何东西,而不是NaN。

答案 1 :(得分:1)

NaN永远不会与任何事物相提并论 - 甚至不是自己。因此,如果您有两个NaN值,它们将不相等。您可以通过对任何有效的xml文件运行这个小的xslt转换来检查这一点:

<xsl:template match="/">
      <xsl:value-of select="'3%' = '3%'"/>|<xsl:value-of select="number('3%') = number('3%')"/>
</xsl:template>

结果是:

true|false

number('3%')试图将'3%'转换为无效且导致NaN的数字。所以在第二种情况下有效地使用NaN = NaN,你可以看到它是假的。

回到你的案例 - 这取决于你想用这个值做什么。如果您盲目地在任何数学运算(加法,乘法等)中使用它,xslt处理器将尝试将您的值转换为数字(由于%字符而为NaN)并且从此点开始任何数学运算的结果将是NaN(我们现在知道)不等于任何东西。 如果你想将值视为字符串,并且由于某种原因首先转换为数字而不是你想要的值,你可以通过执行字符串(项目)显式地转换它。最后,如果您只想检查值是否为有效数字,您可以使用上面的技巧并执行:

<xsl:value-of select="number($item) = $item"/>

如果值不可转换为数字,则数字($ item)返回NaN(我们知道,它不等于任何内容),表示该项目不是有效值。如果$ item可以转换为数字而不是'='的另一边将被隐式转换为数字,并且两者都应该具有相同的值,这将导致返回true

答案 2 :(得分:1)

显而易见的问题是,提供的代码使用当前节点item

调用此模板
<xsl:template name="IsNaN">
 <MyItem>
   <xsl:variable name="myItem" select="item" />
   <xsl:value-of select="$myItem"/>
 </MyItem>
</xsl:template>

这会尝试输出当前节点的第一个item 的字符串值 - 但是在提供的XML文档中,item没有{ {1}}孩子本身。

当然,这并不能解释为什么返回NaN - 任何兼容的XSLT处理器都必须生成空字符串。我相信您的实际代码与您向我们展示的代码不同,实际代码涉及算术运算。在这种情况下,表达式的求值会尝试将空字符串转换为数字 - 结果是NaN。

只需重写上述模板

item
相关问题