xslt is / when выбирает более эффективно, чем если - PullRequest
4 голосов
/ 13 июня 2011

Я знаю, что, как правило, следует избегать операторов if и select из уважения к сопоставлению с образцом.).

В любом случае я могу использовать либо два оператора <xsl:if />, либо оператор <xsl:choose /> с пустым значением <otherwise />.Я хочу знать, какой из них более эффективен.

Вот некоторый фиктивный код:

XML

<?xml version="1.0" encoding="utf-8"?>
  <news>
    <newsItem id="1">
        <title>Title 1</title>
    </newsItem>
    <newsItem id="2">
        <title>Title 2</title>
    </newsItem>
    <newsItem id="3">
        <title></title>
    </newsItem>
    <newsItem id="4">
        <title>Title 4</title>
    </newsItem>
    <newsItem id="5">
        <title>Title 5</title>
    </newsItem>
    <newsItem id="6">
        <title>Title 6</title>
    </newsItem>
  </news>

XSLT 1

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <ol>
            <xsl:apply-templates select="/news/newsItem [string(title)]">
                <xsl:sort order="descending" data-type="number" select="@id"/>
            </xsl:apply-templates>
        </ol>
    </xsl:template>
    <xsl:template match="newsItem">
        <xsl:if test="position() &lt; 5">
            <li>
                <xsl:value-of select="title"/>

                <xsl:if test="position() &lt; 2"> less than two</xsl:if>
                <xsl:if test="position() = 3"> equals 3</xsl:if>
            </li>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

XSLT 2

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <ol>
            <xsl:apply-templates select="/news/newsItem [string(title)]">
                <xsl:sort order="descending" data-type="number" select="@id"/>
            </xsl:apply-templates>
        </ol>
    </xsl:template>
    <xsl:template match="newsItem">
        <xsl:if test="position() &lt; 5">
            <li>
                <xsl:value-of select="title"/>
                <xsl:choose>
                    <xsl:when test="position() &lt; 2"> less than two</xsl:when>
                    <xsl:when test="position() = 3"> equals 3</xsl:when>
                    <xsl:otherwise /> <!-- I know this doesn't need to be here, just included for the sake of readability -->
                </xsl:choose>
            </li>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Спасибо за помощь!

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

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

Тем не менее, я бы использовал решение "выбрать / когда / иначе", если вы никогда не ожидаете и не хотите, чтобы оба эти условия выполнялись. Было бы нелогично проверять оба условия, зная, что будет выполнено только одно, но в зависимости от проверяемых факторов это будет неизбежно.

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

Если бы вы делали это условное выражение на другом языке, таком как JavaScript, вы, вероятно, дважды бы не подумали об использовании решения if / else if / else - опять же, потому что вы хотите, чтобы только одно условие когда-либо выполнялось.

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

Это может быть полезно до некоторой степени, по мнению другого разработчика: http://xsltbyexample.blogspot.com/2008/02/when-to-use-xslif-and-xslwhen.html

2 голосов
/ 13 июня 2011

Когда я изучал это много лет назад, единственное руководство, которое я мог найти, было в этой статье KB:

ИНФОРМАЦИЯ: Методы улучшения производительности XSL-преобразований

Сокращение использования XSL: выбрать / XSL: когда / XSL: в противном случае. Производительность достигается, когда большинство выборов проваливаются в противном случае Таким образом, матч с, когда и попытаться избежать использования в противном случае, когда вы знаете, что конкретное значение существует.

Но я предполагаю, что это будет зависеть от используемого вами процессора XSLT.

1 голос
/ 13 июня 2011

Это вряд ли что-то изменит.Если это произойдет, разница будет полностью зависеть от того, какой процессор XSLT вы используете.Ответ на вопросы о производительности всегда звучит так: «Измерь это!».

1 голос
/ 13 июня 2011

Вероятно, это не имеет существенного значения, но в версии с двумя тестами if оба условия XPath выполняются всегда, тогда как в случае choose, если первое if совпадает, второе будетникогда не должны выполняться,И конкретный движок XSLT будет иметь огромное значение здесь.

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