Почему у меня возникает эта Ошибка во время преобразования XSLT: Ошибка преобразования XSLT? - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь динамически создать дополнительный элемент на основе содержимого элемента времени приготовления. Я также сортирую данные рецепта по времени приготовления и названию рецепта для отображения дополнительных элементов.

Если время приготовления превышает шестьдесят минут, новый элемент должен отображать слова Slow Burner. Если время приготовления меньше или равно шестидесяти минутам и больше или равно тридцати минутам, этот новый элемент должен отображать слова Medium Burner. В противном случае новый элемент должен отображать слова «Быстро и просто».

Я получаю сообщение об ошибке и не понимаю, почему оператор if не работает.

Почему?

XSL здесь:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
    <xsl:template match="/collection">
        <html>

        </html>

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Вы можете изменить свой l oop на следующее. Расположение элемента recipe было изменено для включения в соответствующий table (Конечно, при необходимости измените его обратно).

<xsl:for-each select="recipe">
    <xsl:sort select="cooking_Time" />
    <xsl:variable name="time" select="number(replace(cooking_Time,'minutes',''))" />
    <tr>
        <td>
            <h4>
                <xsl:value-of select="title" />
            </h4>
        </td>
        <td>
            <recipe>
                <xsl:value-of select="if ($time > 60) then 'Slow Burner' else if ($time >= 30) then 'Medium Burner' else 'Quick and Easy'" />
            </recipe>
        </td>
        <td>
            <xsl:value-of select="description" />
        </td>
        <td>
            <xsl:value-of select="servings" />
        </td>
        <td>
            <xsl:value-of select="preparetion_Time" />
        </td>
        <td>
            <xsl:value-of select="cooking_Time" />
        </td>
        <td>
            <xsl:value-of select="passiveTime" />
        </td>
        <td>
            <xsl:value-of select="difficulty" />
        </td>
        <td>
            <xsl:for-each select="ingredients">
                <xsl:for-each select="ingredient">
                    <li>
                        <xsl:value-of select="." />
                    </li>
                </xsl:for-each>
            </xsl:for-each>
        </td>
    </tr>
</xsl:for-each>

Это сортирует элементы по cooking_Time (Вы имел xsl:sort в неправильном месте; он должен следовать сразу за xsl:for-each).

Основной лог c находится в следующем выражении:

<xsl:value-of select="if ($time > 60) then 'Slow Burner' else if ($time >= 30) then 'Medium Burner' else 'Quick and Easy'" />

Он выводит соответствующая строка в зависимости от значения переменной $time (которая была создана для упрощения выражения). fn:replace в переменной

<xsl:variable name="time" select="number(replace(cooking_Time,'minutes',''))" />

заботится о том, чтобы значение переменной $time всегда было числом и не содержало строку «minutes».


Если вы не можете использовать XSLT-2.0, вы также можете использовать это решение XSLT-1.0:

<xsl:for-each select="recipe">
    <xsl:sort select="normalize-space(cooking_Time)" />
    <xsl:variable name="time">
        <xsl:choose>
            <xsl:when test="contains(cooking_Time,'minutes')">
                <xsl:value-of select="number(substring-before(cooking_Time,'minutes'))" />
            </xsl:when>
            <xsl:when test="number(cooking_Time)">
                <xsl:value-of select="number(cooking_Time)" />
            </xsl:when>
            <xsl:otherwise>
                <!-- This value represents any items that don't have a 'cooking_Time' value present -->
                <xsl:value-of select="0" />
            </xsl:otherwise>                                
        </xsl:choose>
    </xsl:variable>
    <tr>
        <td>
            <h4>
                <xsl:value-of select="title" />
            </h4>
        </td>
        <td>
            <recipe>
                <xsl:choose>
                    <xsl:when test="$time &gt; 60">
                        <xsl:text>Slow Burner</xsl:text>
                    </xsl:when>
                    <xsl:when test="$time &gt;= 30 and $time &lt;= 60">
                        <xsl:text>Medium Burner</xsl:text>
                    </xsl:when>
                    <xsl:when test="$time &lt; 30">
                        <xsl:text>Quick and Easy</xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text>Undefined</xsl:text>
                    </xsl:otherwise>
                </xsl:choose>
            </recipe>
        </td>
        <td>
            <xsl:value-of select="description" />
        </td>
        <td>
            <xsl:value-of select="servings" />
        </td>
        <td>
            <xsl:value-of select="preparetion_Time" />
        </td>
        <td>
            <xsl:value-of select="cooking_Time" />
        </td>
        <td>
            <xsl:value-of select="passiveTime" />
        </td>
        <td>
            <xsl:value-of select="difficulty" />
        </td>
        <td>
            <xsl:for-each select="ingredients">
                <xsl:for-each select="ingredient">
                    <li>
                        <xsl:value-of select="." />
                    </li>
                </xsl:for-each>
            </xsl:for-each>
        </td>
    </tr>
</xsl:for-each>

Улучшает сортировку с помощью normalize-space(...) и использует xsl:choose вместо встроенного if s.

0 голосов
/ 29 февраля 2020

Прошло долгое время с тех пор, как я запутался в XSL, но я думаю, что вы рассматриваете строку «30 минут», как если бы она была числом: if cooking_time >= 30. В этом случае одним из возможных обходных путей будет включение числовой c продолжительности в атрибут в XML:

<cooking_time duration="30" unit="minutes">30 minutes</cooking_time>

Кроме того, это может быть проблема копирования / вставки, но это не выглядит правильно:

cooking_Time &gt; -or- > 30 &lt; 60
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...