Ресурс, объясняющий путь обработки XSLT - PullRequest
2 голосов
/ 18 июня 2009

Каков наилучший ресурс для изучения принципов, по которым XSLT применяет шаблонные правила?

Такие вопросы, как this , кажутся такими, что на них должно быть относительно легко ответить, и, конечно, после некоторого изучения. Я почти смущен, чтобы отправить их. Но я посмотрел Справочник программиста XSLT Кея, книгу XSLT Cookbook и Learning XSLT, и до сих пор не могу найти четкого объяснения того, как узел и его дочерние элементы будут обрабатываться набором правил. Возможно, я идиот, но я не нашел Python, Linux, Apache, MySQL или bash чем-то похожим на XSLT из-за явного разочарования.

ОБНОВЛЕНИЕ Спасибо за ваши ответы. Я не смогу поднять это снова в течение нескольких дней, но я ценю помощь.

Ответы [ 3 ]

4 голосов
/ 18 июня 2009

Этот раздел в спецификации Правила шаблона XSLT довольно прост и дает примеры.

Не думайте, что XSLT действует на ваш XML.

Представьте, что ваш XML проходит через XSLT.

XSLT начинается с корневого шаблона, с воображаемым курсором на корневом уровне дерева документа:

<xsl:template match="/">
    ...stuff in here...
</xsl:template>

В середине XSLT начнет выполнять операторы. Если у вас есть <xsl:apply-templates select="...something..."/>, то он найдет в курсоре все, что соответствует XPath в select =, и будет искать шаблоны с <xsl:template match="...something...">. Первый найденный в соответствии с правилами приоритета будет выполнен.

При выполнении этого нового шаблона применяются те же вещи, за исключением того, что контекст теперь является тем узлом, который соответствует.

Это основы. Так, например, если у вас есть эта программа XSLT, то независимо от того, какой ввод, вы получите <hello world="!"/> как вывод:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <hello world="!"/>
    </xsl:template>
</xsl:stylesheet>

Но если у вас есть такой ввод:

<people>
    <name>Paige</name>
    <name>Hayley</name>
    <name>Hamlet</name>
</people>

и использовать это как преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <table>
                    <xsl:apply-templates select="/people/name[substring(., 1, 1) = 'H']"/>
                </table>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="name">
        <tr>
            <td>
                <xsl:value-of select="."/>
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

Сначала будет настроен файл HTML. Затем он найдет все элементы name в элементах people под корневым элементом, и, если они начинаются с буквы «H», будет произведен поиск шаблона, который соответствует «name». Так как у нас есть один, он выпишет строку таблицы с именем. Он выполнит это правило дважды, после чего элементы HTML будут закрыты, и сценарий завершится.

Помогает ли это?

3 голосов
/ 18 июня 2009

Ответы, прежде всего, помогают объяснить, что происходит, если у вас есть определенные шаблоны, но очень важно понимать и встроенное поведение 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 = '' *.

Надеюсь, это поможет. Это одна из тех ситуаций, когда диаграмма - лучший из возможных подходов.

1 голос
/ 18 июня 2009

Если у вас есть немного денег на обучение, у Кена Холмана есть отличный набор учебных курсов по XML / XSLT / XPATH / XSL-FO.

http://www.cranesoftwrights.com/training/ptux/ptux-video.htm Он ссылается на некоторые примеры видео.

Я присутствовал на его тренировках лично. Он очень тщательно объясняет модель обработки, функции и аспекты XML / XSLT / XPATH. Важно понимать, как обрабатываются деревья узлов и как движок XSLT «обходит дерево». Тогда XSLT-шаблоны и различие между «push» и «pull» действительно имеют смысл.

XSLT требует другого взгляда на вещи. Многим программистам трудно настроить или понять XSLT, потому что они продолжают думать о вещах с точки зрения процедурного кода, а не более функционального подхода.

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