Ответы, прежде всего, помогают объяснить, что происходит, если у вас есть определенные шаблоны, но очень важно понимать и встроенное поведение XSLT.
Обработка шаблонов осуществляется самим механизмом XSLT, а не вашим кодом. Таким образом, это очень отличается от процедурных языков, которые вы упомянули. Если у вас есть опыт в функциональном программировании, это очень поможет.
Начальное поведение XSLT - соответствие узла документа. Узел документа - это «воображаемый» узел, который действует как родительский узел корневого узла вашего XML-документа. Он представляет весь документ. По сути, встроенным поведением является xsl: apply-templates, которое выглядит следующим образом:
<xsl:apply-templates select='/|*'/>
Инструкция xpath соответствует номеру документа или любому другому элементу. Он соответствует корневому узлу, а затем пересекает ваш документ. Думайте о документе как о дереве. На каждом узле элемента он будет выполнять точно такой же оператор. XSLT пересекает узлы в порядке слева направо (поэтому, если у вашего корневого элемента есть два дочерних элемента, он попадет в первый в документе перед вторым). Так как он выполняет выборку выше, он будет переходить к потомкам этого узла и делать то же самое. Это обход дерева слева направо в глубину.
Теперь на каждом элементном узле движок XSLT будет искать соответствующий шаблон. Правила относительно просты - он выберет для исполнения наиболее конкретный шаблон. Встроенный шаблон всегда наименее конкретен. Шаблон, соответствующий полному пути, очень специфичен:
<xsl:template match='/some/path/to/a/node'>...</xsl:template>.
Шаблон, соответствующий только имени узла, менее конкретен:
<xsl:template match='node'>...</xsl:template>
Если вы определили шаблон, который выбирает движок (любой шаблон, который вы определили, будет использоваться вместо встроенного), обход по умолчанию выше останавливается. Он запускает ваш шаблон и останавливается, если ваш шаблон снова не начинает обход:
<xsl:template match='node'>
<p><xsl:value-of select='@text'/></p>
<xsl:apply-templates/>
</xsl:template>
Применимые выше шаблоны apply перезапускают наш обход (кстати, apply-templates без атрибута select аналогичны использованию select = '' *.
Надеюсь, это поможет. Это одна из тех ситуаций, когда диаграмма - лучший из возможных подходов.