我正在使用XSLT划分两个XML元素。定义变量后,我一直收到NaN响应。

时间:2018-11-11 23:49:29

标签: xml xslt xpath

我是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>

2 个答案:

答案 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>

XSLT Demo

答案 1 :(得分:0)

head元素不是nutrient的子元素,因此$ servings变量的值是一个空节点集,将空节点集转换为数字将返回NaN。

使用路径表达式时,您需要了解“当前节点”的概念,这是从中进行选择的地方。在与“营养”元素匹配的模板中,该元素是当前节点。

以后,当在StackOverflow上询问XSLT问题时,请务必说出您使用的是XSLT 1.0还是2.0。两者都被广泛使用,并且有很多差异。