Я делю два элемента XML с помощью XSLT. Я продолжаю получать ответ NaN после определения переменных. - PullRequest
0 голосов
/ 12 ноября 2018

Я новичок в 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 голосов
/ 12 ноября 2018

Элемент head не является дочерним для nutrient, поэтому значение переменной $ serves является пустым набором узлов, а преобразование пустого набора узлов в число возвращает NaN.

Когда вы используете выражения пути, вам необходимо понимать концепцию «текущего узла», из которого делаются выборки. В шаблоне, который соответствует элементу «нутриент», этот элемент является текущим узлом.

В будущем при задании вопросов XSLT в StackOverflow обязательно укажите, используете ли вы XSLT 1.0 или 2.0. Оба широко используются, и у них много различий.

0 голосов
/ 12 ноября 2018

Просто ваши 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 порций». Добавьте еще один шаблон, чтобы пройтись по дереву от корня и написать стиль только для узла nutritionent . Даже добавить выходные параметры для отступа и 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...