Я делаю это, используя для каждого цикла, но я
можно также применить шаблон к нему. я
не вижу четкой линии, когда использовать
циклы и когда использовать шаблоны.
Использование <xsl:for-each>
ни в коем случае не вредно, если точно знать, как обрабатывается <xsl:for-each>
.
Проблема в том, что многие новички в XSLT, имеющие опыт в императивном программировании, принимают <xsl:for-each>
вместо «цикла» в своем любимом PL и думают, что это позволяет им выполнять невозможное - например, увеличивать счетчик или любая другая модификация уже определенного <xsl:variable>
.
Одним обязательным использованием <xsl:for-each>
в XSLT 1.0 является изменение текущего документа - это часто необходимо для того, чтобы можно было использовать функцию key()
в документе, отличном от текущего исходного XML-документа, для Пример эффективного доступа к таблице поиска, которая находится в его собственном XML-документе.
С другой стороны, использование <xsl:template>
и <xsl:apply-templates>
намного мощнее и элегантнее.
Вот некоторые из наиболее важных различий между двумя подходами :
xsl:apply-templates
намного богаче и глубже, чем xsl:for-each
, даже
просто потому, что мы не знаем, какой код будет применяться на узлах
выбор - в общем случае этот код будет отличаться для
разные узлы списка узлов.
Код, который будет применяться
может быть написано так, как xsl:apply template
s было написано и
люди, которые не знают оригинального автора.
В библиотеке FXSL реализация функций высшего порядка (HOF) в XSLT была бы невозможна , если бы в XSLT не было инструкции <xsl:apply-templates>
.
другой вопрос это нормально просто
скажи apply-templates, когда ты (k) сейчас
что не будет других детей
элемент, где вы пишете это
<xsl:apply-templates/>
является сокращением для:
<xsl:apply-templates select="child::node()"/>
Даже если есть другие дочерние элементы текущего узла, о которых вам все равно, вы все равно можете использовать короткий <xsl:apply-templates>
и иметь еще один такой шаблон:
<xsl:template match="*"/>
Этот шаблон игнорирует («удаляет») любой элемент. Вы должны переопределить его с более конкретными шаблонами (в XSLT, как правило, более конкретные шаблоны имеют более высокий приоритет и выбираются для обработки по менее конкретным шаблонам, соответствующим одному и тому же узлу):
<xsl:template match="ebook">
<!-- Necessary processing here -->
</xsl:template>
Я обычно не использую <xsl:template match="*"/>
, но я использую другой шаблон, который соответствует (и игнорирует) каждый текстовый узел:
<xsl:template match="text()"/>
Обычно это имеет тот же эффект, что и при использовании <xsl:template match="*"/>
, из-за того, что XSLT обрабатывает узлы, для которых нет соответствующего шаблона. В любом таком случае XSLT использует свои встроенные шаблоны в так называемой обработке по умолчанию.
Результатом обработки по умолчанию в XSLT поддерева, укорененного в элементе, является вывод конкатенации (в порядке документа) всех потомков текстового узла этого элемента.
Следовательно, предотвращение вывода любого текстового узла, использующего <xsl:template match="text()"/>
, имеет тот же (нулевой) результат вывода, что и предотвращение вывода обработкой элемента с использованием <xsl:template match="*"/>
.
Резюме :
Шаблоны и инструкция <xsl:apply-templates>
- это то, как XSLT реализует и работает с полиморфизмом.
В духе модели обработки XSLT использовать более общие шаблоны, соответствующие большим классам узлов, и выполнять для них некоторую обработку по умолчанию, а затем переопределять общие шаблоны более конкретными, которые соответствуют и обрабатывают только те узлы, которые мы интересует.
Ссылка : Просмотреть всю ветку: http://www.stylusstudio.com/xsllist/200411/post60540.html