С чего вы взяли, что процедурные условия здесь не применяются? Просто соглашение о вызовах несколько более неявное, чем вы обычно ожидаете, потому что в нем присутствует невидимый контекст. Все, что apply-templates
делает, может быть выражено в процедурных терминах.
По сути, apply-templates
- это не что иное, как цикл для каждого. Начиная с того места, где вы в данный момент находитесь в документе (контекст, подумайте «this
»), он перебирает дочерние узлы.
Для каждого дочернего процесса процессор выбирает соответствующий xsl:template
с наивысшим приоритетом (на основе их соответствующих атрибутов match
и priority
), устанавливает контекст для дочернего элемента и запускает этот шаблон (думаю, "function
"). После возвращения шаблона контекст возвращается назад, и наступает следующий дочерний ход.
Даже когда все становится рекурсивным (чего довольно трудно избежать в XSLT), весь процесс действительно не становится более сложным. Контекстный «указатель» перемещается, а шаблоны вызываются.
Вы можете ограничить набор узлов, который повторяется apply-templates
, используя атрибут select
:
<!-- all children of the context node regardless -->
<xsl:apply-templates />
<!-- all children of the context node being "data" with a @name of "Foo" -->
<xsl:apply-templates select="data[@name='Foo']" />
Вы можете отсортировать набор узлов до итерации, если хотите:
<!-- all children of the context node being "data" with a @name of "Foo",
ordered by their respective "detail" count -->
<xsl:apply-templates select="data[@name='Foo']">
<xsl:sort select="count(detail)" data-type="number" order="descending"/>
</xsl:apply-templates>
И вы можете передавать параметры в свой шаблон, если вам нужно, так же, как вы это делаете с обычным вызовом функции:
<!-- pass in some parameter -->
<xsl:apply-templates select="data[@name='Foo']">
<xsl:with-param name="DateSetIcon" select="$img_src" />
</xsl:apply-templates>
Вот и все, что нужно.
EDIT:
Я знаю, что последний комментарий немного провокационный. Это очень намеренно, для базового понимания того, как работает apply-templates
, это более или менее так. Последствия и возможности, вытекающие из того факта, что не вы определяют, какой шаблон вызывать, а скорее позволяют процессору выбрать подходящий для вас, конечно, больше, чем то, на что это похоже на неподготовленное ухо. Декларативный / неявный подход всего этого, безусловно, требует некоторого времени, чтобы погрузиться.