我是XML的新手,我正在使用XML建立一些方案。我正在使用XSLT转换XML,但是,我一直得到NaN作为响应。
我想通过将每份食物的产量(低于产量)除以卡路里的数量(由营养不足所定义),来创建每份食物的卡路里。我不确定我是否正确分配了号码。
任何提示将不胜感激。
XML代码:
<recipe>
<head>
<yield>
<qty>7</qty>
<unit>servings</unit>
</yield>
</head>
<nutrition>
<nutrient>
<n-name>calories</n-name>
<qty>1200</qty>
</nutrient>
</nutrition>
</recipe>
XSLT代码:
<xsl:template match="nutrient">
<xsl:variable name="calorietotal" select="//nutrient[n-name='calories']/qty" />
<xsl:variable name="servings" select="head[yield='serving']/qty" />
<div class="ings">
<div class="numcals">Calories Per Serving:</div>
<xsl:value-of select="$calorietotal div $servings" />
</div>
</xsl:template>
答案 0 :(得分:1)
仅在您的营养节点的上下文中,您的XPath并不正确,并且拼写错误。请考虑以下调整,在这些调整中除法不会导致NaN。
<xsl:variable name="calorietotal" select="n-name[.='calories']/following-sibling::qty" />
<xsl:variable name="servings" select="/recipe/head/yield[unit='servings']/qty" />
同样,您也没有详尽地重写树,因此一些未指定的节点文本会在输出中呈现,例如“ 7份”。添加另一个模板以从根开始沿着树走,并且仅为营养节点编写样式。甚至为缩进和html方法添加输出参数。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" method="html"/>
<xsl:template match="/recipe">
<xsl:apply-templates select="nutrition/nutrient"/>
</xsl:template>
<xsl:template match="nutrient">
<xsl:variable name="calorietotal" select="n-name[.='calories']/following-sibling::qty"/>
<xsl:variable name="servings" select="/recipe/head/yield[unit='servings']/qty"/>
<div class="ings">
<div class="numcals">Calories Per Serving:</div>
<xsl:value-of select="$calorietotal div $servings"/>
</div>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
head
元素不是nutrient
的子元素,因此$ servings变量的值是一个空节点集,将空节点集转换为数字将返回NaN。>
使用路径表达式时,您需要了解“当前节点”的概念,这是从中进行选择的地方。在与“营养”元素匹配的模板中,该元素是当前节点。
以后,当在StackOverflow上询问XSLT问题时,请务必说出您使用的是XSLT 1.0还是2.0。两者都被广泛使用,并且有很多差异。