посоветуйте XSLT преобразование

Kirill

Новичок
посоветуйте XSLT преобразование

xml:
<line>
<item type="text">some text</item>
<item type="act" link="lnk">some text</item>
<item type="textarea">some text</item>
</line>

Как лучше сделать XSLT преобразование, если каждая нода item должна обрабатываться по разному, в зависимости от типа?
Знаю несколько решений, но что лучше.
1)
<xsl:template match="line">
<tr><xsl:apply-templates select="item"/></tr>
</xsl:template>

<xsl:template match="line/item[@type='text']">
<td><xsl:value-of select="text()"/></td>
</xsl:template>

2) <xsl:template match="line/item">
Далее натыкать проверок <xsl:if> или case

Что будет проще впоследствии поправить и что быстрее работает?
 

denver

?>Скриптер
По быстроте будет одинаково, по удобству - как кому нравится или как того требует ситуация.
 

slach

Новичок
denver. прежде чем советовать, попробовал бы для начала benchmark на количестве item больше 100

первый вариант ЛУЧШЕ и идеологически ПРАВИЛЬНЕЕ

куча if это медленнее
хотя конечно зависит от реализации процессора
 

zarus

Хитрожопый макак
Первый вариант читабельнее. Насчет скорости не скажу, но всегда использую этот вариант, если от типа целиком зависит вывод. А вот если от типа зависит пара элементов, а остальное - 1 в 1, то <xsl:choose>
 

denver

?>Скриптер
Ну насчет идейности это перебор.
То что вы предлагаете называется Push Transformation (matching). Набор if-ов это Pull Transformation (querying). И один и второй поддерживаются by XSLT, оба хороши для своих задач. По скорости они одинаковы, т.к. еще до распарсивания XML вся логика (набор правил) строится в памяти. И ИДЕЙНО всё равно как это выглядело ДО, как <template match="XPath"> или как <if test="XPath">.

http://www-128.ibm.com/developerworks/xml/library/x-xdpshpul.html
 

inTox

вёбных дел мастер
По скорости они одинаковы
Вот прям одинаковы?
PHP:
<xsl:stylesheet  version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="item">
    <li>
        <a href="{@href}">
            <xsl:apply-templates />
        </a>
    </li>
</xsl:template>
<xsl:template match="item[@active]">
    <li>
        <b>
            <xsl:apply-templates />
        </b>
    </li>
</xsl:template>
</xsl:stylesheet>
и
PHP:
<xsl:stylesheet    version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="item">
    <li>
        <xsl:choose>
            <xsl:when test="@active">
                <b>
                    <xsl:apply-templates />
                </b>
            </xsl:when>
            <xsl:otherwise>
                <a href="{@href}">
                    <xsl:apply-templates />
                </a>
            </xsl:otherwise>
        </xsl:choose>
    </li>
</xsl:template>
</xsl:stylesheet>
любопытно, как Вы меряете? =) libxml, кстати, имеется ввиду?
...насчет идейности это перебор.
...И ИДЕЙНО всё равно как это выглядело ДО, как <template match="XPath"> или как <if test="XPath">.
Не перебор. Определенный отдельно частный случай гораздо удобнее для локального переопределения. Он также логичнее с точки зрения идеологии XSLT, который преобразует деревья.
 

denver

?>Скриптер
Вот не поленился и проверил. Для XML с 10,000 items:
<xsl:template> метод: 30.08 сек
<xsl:choose> метод: 29.48 сек
Процессор libxslt (т.е. из поставки PHP5).

В MSIE парсятся одинаково быстро оба - примерно за 0.5 сек (msxml 6?)

Тест можно скачать здесь (3 kb)

-~{}~ 28.11.06 09:43:

Определенный отдельно частный случай гораздо удобнее для локального переопределения. Он также логичнее с точки зрения идеологии XSLT, который преобразует деревья.
Да, деревья. Причем с помощью дерева же, причем которое сначала же и строит. Представьте себе шахматную программу в которую ввели все возможные ходы и она не просчитывает, а всегда знает каким ходом нужно ответить на любой ход соперника для того чтобы выиграть. Если бы это было возможно (для шахмат), стратегия представлялась бы деревом, и абсолютно неважно по какому принципу это дерево ИЗНАЧАЛЬНО строится.
 

Alexandre

PHPПенсионер
Для XML с 10,000 items:
<xsl:template> метод: 30.08 сек
<xsl:choose> метод: 29.48 сек
мда... многовато

В MSIE парсятся одинаково быстро оба - примерно за 0.5 сек
даже не верится разница 30 сек и 0.5 - не путаешь?

все-таки для чистоты эксперимента, надо было проверять xsltproc - это былоб сравнимо со временем MSIE ( хотя по тестам msxml признано быстрее, чем libxslt )

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

вообще результаты наталкивают на интересный вывод
 

denver

?>Скриптер
Alexandre
Не знаю почему такая разница, наверное реализация libxslt неоптимальна. Скачай архив и проверь если хошь, хоть и на xsltproc.
 

inTox

вёбных дел мастер
надо в другую чтоль перебраться?..
про тест:
PHP:
xsltproc -profile -noout index_pull.xsl index.xml
number               match                name      mode  Calls Tot 100us Avg
    0                 item                                10006   9769      0
                         Total                            10006   9769
xsltproc -profile -noout index_push.xsl index.xml
number               match                name      mode  Calls Tot 100us Avg
    0                 item                                 6909   5528      0
    1        item[@active]                                 3097   1774      0
                         Total                            10006   7302
-~{}~ 28.11.06 15:46:

Представьте себе шахматную программу в которую ввели все возможные ходы и она не просчитывает, а всегда знает каким ходом нужно ответить на любой ход соперника для того чтобы выиграть.
смешно. но, тем не менее, показательный пример. =)

ладно, в отрыве от конкретного примера считаю это холиваром. =)
 

slach

Новичок
хммм... интересно что они поменяли, когда я последний раз такой случай замерял
у меня template был существенно быстрее, denver спасибо за тест
 
Сверху