Я в целом согласен с другими ответами, но скажу, что по моему опыту, таблица стилей, написанная с xsl:for-each
, может быть намного легче читать, понимать и поддерживать, чем та, которая сильно зависит от xsl:apply-templates
...Особенно xsl:apply-templates
с неявным выбором (или очень общим выбором, например select="node()"
).
Почему?Потому что очень легко увидеть, что сделает каждый.С apply-templates вы по сути должны (а) знать обо всех возможных входах XML (что будет проще, если у вас есть схема, но тогда вам все равно придется переваривать схему; и во многих случаях у вас нет схемыособенно для переходных промежуточных данных XML, отправляемых на одном этапе конвейера, и даже если у вас есть схема, ваша среда разработки (например, ESB или CMS) может не дать вам способа проверить ваш XML в каждой точке конвейера.Таким образом, если в вас закрадываются недействительные данные, вы не будете сразу уведомлены), так что вы можете предсказать, какие типы узлов будут выбраны (например, дочерние элементы контекстного узла);и (b) просмотреть каждый шаблон в таблице стилей, чтобы увидеть, какой шаблон соответствует тем узлам с наивысшим приоритетом (и последним в порядке документов).Порядок обработки может также пропустить все файлы или другие файлы (импортированные или включенные).Это может сделать очень трудным «увидеть», что происходит.
Принимая во внимание, что для каждого вы точно знаете, какой код будет создан: код внутри для каждого.А поскольку для for-each требуется явное выражение select, у вас, скорее всего, будет более узкое поле для определения того, какие узлы могут быть сопоставлены.
Теперь я не отрицаю, что apply-templates намного большемощный и гибкий, чем для каждого.В том-то и дело: конструкции, которые являются более мощными и гибкими, также сложнее ограничивать, понимать и отлаживать (и предотвращать дыры в безопасности).Это правило наименьшей мощности : «Мощные языки (или в данном случае конструкции) запрещают повторное использование информации».( Также обсуждается здесь .)
Когда вы используете apply-templates, каждый шаблон является более модульным и, следовательно, более пригодным для повторного использования, но таблица стилей более сложна, и взаимодействие между шаблонами меньшепредсказуемы.Когда вы используете for-each, поток обработки легко предсказать и увидеть.
С <xsl:apply-templates />
, (или с <xsl:for-each select="node()"/>
), когда изменяется структура входного XML, поведение таблицы стилейизменения, без обзора разработчика.Хорошо это или плохо, зависит от того, сколько внимания вы вложили в свою таблицу стилей и насколько хорошо существует связь между разработчиком схемы XML и разработчиком таблицы стилей (который может быть одним и тем же лицом или принадлежать к разным организациям).
Так что для меня это призывный суд.Если у вас есть документно-ориентированный XML, такой как HTML, где у многих типов элементов действительно может быть много разных типов потомков в иерархии произвольной глубины, и обработка данного типа элемента не очень часто зависит от его контекста, тогда применять-шаблоны абсолютно необходимо.С другой стороны, если у вас есть «ориентированный на данные» XML с предсказуемой структурой, где у вас не часто есть один и тот же тип элемента, означающий одно и то же в разных контекстах, for-each может быть намного проще для чтения и отладки(и поэтому писать правильно и быстро).