Что такого плохого в xsl: for-each? - PullRequest
6 голосов
/ 10 апреля 2009

Я снова и снова слышу о том, как вам следует избегать использования XSLT для каждого. Что это ваш внутренний император программирования, которого следует изгнать.

Что в этом плохого?

Имеет ли значение эта передовая практика в зависимости от размера XML (т.е. 100 против 10 000 узлов)?

Ответы [ 5 ]

6 голосов
/ 10 апреля 2009

Существенная разница между <xsl:apply-templates> и <xsl:-for-each>, на которую никто не указал :

  1. <xsl:apply-templates> на самом деле нечто большее, чем более приятный, более элегантный эквивалент <xsl:for-each>:

xsl:apply-templates гораздо богаче и глубже, чем xsl:for-each, даже просто потому, что мы не знаем, какой код будет применяться на узлах выбор - в общем случае этот код будет отличаться для разные узлы списка узлов .

Также код, который будет применяться может быть написано так, как шаблоны xsl: apply были написаны и люди, которые не знают оригинального автора .


_2. С другой стороны, с использованием <xsl:for-each> никоим образом не вредно, если точно знать, как обрабатывается <xsl:for-each> .

Проблема в том, что многие новички в XSLT, имеющие опыт в императивном программировании, принимают <xsl:for-each> вместо «цикла» в своем любимом PL и думают, что это позволяет им выполнять невозможное - например, увеличивать счетчик или любая другая модификация уже определенного <xsl:variable>.

Одним из обязательных вариантов использования <xsl:for-each> является изменение текущего документа - это часто требуется , чтобы иметь возможность использовать функцию key () в документе, отличном от текущего исходного XML документ , например, для эффективного доступа к справочной таблице, которая находится в его собственном XML-документе.

5 голосов
/ 10 апреля 2009

Шаблоны имеют тенденцию делить код более красиво. Кроме того, циклы for-each страдают от того, что люди часто приходят к ним с мыслью, что они работают идентично тому, как работают циклы в основных языках программирования.

2 голосов
/ 10 апреля 2009

Использование for-each для вызова шаблонов не рекомендуется, а не широкое использование for-each как таковое. Даже мюнхенский метод группировки опирается на xsl:key конструкции с xsl:for-each петлями.

Идея написания хорошего XSLT заключается в том, что структура вашего XML должна определять, какие шаблоны будут сопоставлены, а затем применены. Поэтому, когда это возможно, используйте apply-templates для выбора узлов вместо применения выбора с использованием for-each.

2 голосов
/ 10 апреля 2009

Быстрый ответ: XSLT в основном функционален по своей природе, а императивные петли не очень функциональны.

В общем, основанный способ получить максимум от XSLT - максимально использовать сопоставление с образцом (xsl:apply-template, а не циклы, ifs и call-template 1 ).

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

1 Кроме случаев, когда создаются функции, которые возвращают значения, а не изменяют вывод.

1 голос
/ 10 апреля 2009

Использование apply-templates, возможно, с mode, упрощает включение соответствующих преобразований для большего количества элементов, которые могут представлять интерес в этом месте.

Например, если у вас был XML, содержащий содержимое библиотеки, и вы продолжаете использовать for-each повсеместно для выбора книг, то вы начинаете вести учет DVD, CD, печенья с имбирным орехом и т. Д., Вам придется проверить все разделы для каждого включают больше, чем просто книги. Если вы использовали apply-templates, вы можете просто создать новые совпадения для новых элементов.

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