В каком порядке выполняются шаблоны в документе XSLT и соответствуют ли они исходному XML или буферизованному выводу?

Вот что всегда озадачивало меня в XSLT:

В каком порядке выполняются шаблоны, иКогда они выполняются, совпадают ли они с (a) исходным XML-кодом или (b) текущим выводом XSLT к этой точке?

Пример:

<person>
  <firstName>Deane</firstName>
  <lastName>Barker</lastName>
</person>

Вот фрагмент XSLT:

<!-- Template #1 -->
<xsl:template match="/">
  <xsl:value-of select="firstName"/> <xsl:value-of select="lastName"/>
</xsl:template>

<!-- Template #2 -->
<xsl:template match="/person/firstName">
  First Name: <xsl:value-of select="firstName"/>
</xsl:template>

Два вопроса по этому поводу:

Я предполагаю, что Шаблон # 1 будет выполнен первым. Я не знаю, почему я так предполагаю - это только потому, что оно появляется первым в документе?Будет ли выполнен шаблон № 2? Он соответствует узлу в исходном XML, но к тому времени, когда мы доберемся до этого шаблона (при условии, что он запускается вторым), узел «firstName» не будет в выходном дереве.

Итак, являются ли «более поздние» шаблоны обязательными к тому, что произошло в «более ранних» шаблонах, или они работают с исходным документом, не обращая внимания на то, что было преобразовано «до них»? (Все эти слова в кавычках, потому что мне трудно обсуждать временные вопросы, когда я действительно мало представляю, как в первую очередь определяется порядок шаблонов ...)

В приведенном выше примере у нас есть шаблон, который совпадает с корневым узлом ("/"), который - когда он выполняется, - по существу удалил все узлы из вывода. В таком случае, будет ли это препятствовать выполнению всех других шаблонов, поскольку после завершения первого шаблона будет нечего сопоставлять?

К этому моменту я был обеспокоен тем, что более поздние шаблоны не выполняются, потому что узлы, с которыми они работали, не отображаются в выходных данных, но как насчет обратного? Может ли «более ранний» шаблон создать узел, с которым «поздний» шаблон может что-то делать?

На том же XML, что и выше, рассмотрим этот XSL:

<!-- Template #1 -->
<xsl:template match="/">
  <fullName>
    <xsl:value-of select="firstName"/> <xsl:value-of select="lastName"/>
  </fullName>
</xsl:template>

<!-- Template #2 -->
<xsl:template match="//fullName">
  Full Name: <xsl:value-of select="."/>
</xsl:template>

Шаблон # 1 создает новый узел с именем «fullName». Шаблон № 2 соответствует этому же узлу. Будет ли выполнен шаблон № 2, потому что узел «fullName» будет присутствовать в выходных данных к тому времени, когда мы перейдем к шаблону № 2?

Я понимаю, что я глубоко не осведомлен о «дзен» XSLT. На сегодняшний день мои таблицы стилей состоят из шаблона, соответствующего корневому узлу, а затем являются полностью процедурными. Я устал от этого. Я бы предпочел на самом деле правильно понять XSLT, отсюда и мой вопрос.

Ответы на вопрос(4)

Ваш ответ на вопрос