XSLT - как процессор XSLT соответствует шаблонам - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь понять основную идею, как работает 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-процессор перебирает узлы в контексте и пытается найти шаблон для каждого узла для сопоставления и выполнения. Контекст является синонимом «текущий узел». Что я не понимаю, так это: процессор выполняет итерацию через узлы, являющиеся дочерними элементами текущего узла (поэтому в моем примере только узел сообщений, поскольку он является единственным потомком узла документа), или через все узлы, являющиеся потомками текущего узла?

1 Ответ

0 голосов
/ 30 октября 2018

Чтобы понять, что произошло, вы должны взглянуть на HTML-код, созданный в результате преобразования XSL, а не на то, как этот код отображается на экране. Вы получаете:

<i>Hello World!</i>
Bye World!

Первая строка создается с помощью (последнего) шаблона, соответствующего greeting*. Вторая строка создается с помощью встроенных шаблонных правил , которые обрабатывают элемент farewell при отсутствии соответствующего шаблона. Эти шаблоны копируют любые текстовые узлы в вывод.


(*) Ошибка иметь два конфликтующих шаблона. Однако спецификация позволяет процессору игнорировать ошибку и применять последний соответствующий шаблон в документе XSLT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...