Я пытаюсь понять основную идею, как работает XSLT 1.0. Я использую браузер Firefox для обучения. Следующий пример не практичен, а скорее иллюстрирует основу для моего вопроса.
Для исходного XML-документа:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="helloworld.xsl"?>
<messages>
<greeting>Hello World!</greeting>
<farewell>Bye World!</farewell>
</messages>
И таблица стилей:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" encoding="UTF-8" />
<xsl:template match="greeting">
<b><xsl:value-of select="." /></b>
</xsl:template>
<xsl:template match="farewell">
<b><xsl:value-of select="." /></b>
</xsl:template>
</xsl:stylesheet>
Я получаю "Hello Word!" и "Пока мир!" выделено жирным шрифтом. Если я использую следующую таблицу стилей:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" encoding="UTF-8" />
<xsl:template match="greeting">
<b><xsl:value-of select="." /></b>
</xsl:template>
<xsl:template match="greeting">
<i><xsl:value-of select="." /></i>
</xsl:template>
</xsl:stylesheet>
Тогда "Пока, Мир!" как и ожидалось, не жирный, но «Hello World» также не жирный, только курсивом. Что случилось? В первой версии таблицы стилей кажется, что оба шаблона были выполнены - оба соответствуют узлу документа. Во второй версии кажется, что только вторая была выполнена, или ее вывод перезаписал первую. Я был бы очень благодарен за объяснение, на каком основании процессор XSLT сопоставляет узлы с шаблонами в обеих таблицах стилей.
Из того, что я понимаю: в начале трансформации узел документа выбирается в качестве контекста. XSLT-процессор перебирает узлы в контексте и пытается найти шаблон для каждого узла для сопоставления и выполнения. Контекст является синонимом «текущий узел». Что я не понимаю, так это: процессор выполняет итерацию через узлы, являющиеся дочерними элементами текущего узла (поэтому в моем примере только узел сообщений, поскольку он является единственным потомком узла документа), или через все узлы, являющиеся потомками текущего узла?