Вот что всегда озадачило меня в 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? Он соответствует node в исходном XML, но к тому моменту, когда мы получим этот шаблон (при условии, что он выполняется второй), "firstName" node не будет в дереве вывода.
Итак, являются ли "последующие" шаблоны обязательными для того, что произошло в "ранних" шаблонах, или они работают с исходным документом, не обращая внимания на то, что было им "доведено"? (Все эти слова в кавычках, потому что мне трудно обсуждать вопросы, основанные на времени, когда я действительно мало понимаю, как определяется порядок шаблонов в первую очередь...)
В приведенном выше примере у нас есть шаблон, который соответствует корню node ( "/" ), который - когда он выполняется, - существенно удалил все узлы из вывода. В этом случае это предотвратит выполнение всех других шаблонов, поскольку после завершения этого первого шаблона не будет ничего подходящего?
К этому моменту я был обеспокоен тем, что более поздние шаблоны не выполняются, потому что узлы, на которых они работали, не отображаются в выходном файле, но как насчет обратного? Может ли "более ранний" шаблон создать node, что "более поздний" шаблон может что-то сделать с?
В том же 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 создает новый node, называемый "fullName". Шаблон № 2 совпадает с тем же node. Будет ли Шаблон №2 выполняться, потому что "fullName" node существует в выходе к моменту, когда мы обходим шаблон Template # 2?
Я понимаю, что я глубоко не осведомлен о "дзэн" XSLT. На сегодняшний день мои таблицы стилей состоят из шаблона, соответствующего корню node, а затем являются полностью процедурными. Я устал от этого. Я бы предпочел правильно понять XSLT правильно, поэтому мой вопрос.