XSLT Абстракции - PullRequest
       24

XSLT Абстракции

10 голосов
/ 03 октября 2008

Я изучаю XML -> XSLT -> HTML-мем для создания веб-контента. У меня очень мало опыта XSLT.

Мне любопытно, какие механизмы доступны в XSLT для обработки абстракций или «рефакторинга».

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

Общие языки разметки, JSP, PHP, ASP, позволяют настолько динамически наполнять все эти сегменты (например, добавление имени пользователя в каждый блок заголовка).

JSP идет еще дальше, позволяя создавать файлы тегов, которые могут принимать аргументы, которые будут использоваться при генерации контента, и даже окружать и работать с контентом внутри самих тегов.

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

Ответы [ 6 ]

14 голосов
/ 03 октября 2008

Для моего собственного проекта я так разделил свои страницы. Был файл template.xsl, который был импортирован каждым из моих XSL. У большинства страниц просто был template.xsl, но некоторые страницы, такие как корзина и т. Д., Нуждались в своих собственных из-за разного рода данных, которые они анализировали.

<page title="Home">
    <navigation>
        <!-- something here -->
    </navigation>
    <main>
        <!-- something here -->
    </main>
</page>

Это фрагмент из моего template.xsl. Я бросил все обычные вещи здесь, а затем дал возможность для моих страниц, чтобы добавить свою собственную информацию через call-template.

<xsl:template match="/page" name="page">  
    <html>
    <head>  
        <title><xsl:value-of select="(@title)" /></title>           
        <xsl:call-template name="css" />
        <xsl:call-template name="script" />
    </head>
    <body>
        <xsl:call-template name="container" />
    </body>
    </html>
</xsl:template>

Пример ответа моего тега css. Обратите внимание, что он вызывает только css-extended. CSS имел общий CSS, который будет применяться на всех страницах. Некоторым страницам нужно больше. Те может переопределить css-extended. Обратите внимание, что это необходимо, потому что call-template потерпит неудачу, если страница вызывает шаблон, но нигде не определяет его.

   <xsl:template name="css">
        <link rel="stylesheet" type="text/css" href="{$cssPath}reset.css"  />
        <link rel="stylesheet" type="text/css" href="{$cssPath}style.css"  />
        <link rel="stylesheet" type="text/css" href="{$cssPath}layout.css" />
        <xsl:call-template name="css-extended" />
    </xsl:template>   

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets -->
    <xsl:template name="css-extended" />

Мой контейнер будет работать аналогичным образом - были определены общие вещи, а затем каждая страница мог бы просто предоставить реализацию. Реализация по умолчанию была в XSL. (в content)

  <xsl:template name="container">
        <div id="container">
            <xsl:call-template name="header" />
            <xsl:call-template name="content" />
            <xsl:call-template name="footer" />
        </div>
    </xsl:template>  

    <xsl:template name="content">
        <div id="content">
            <div id="content-inner">
                <xsl:call-template name="sideBar" />
                <xsl:call-template name="main" />
            </div>
        </div>
    </xsl:template>   

    <xsl:template name="main">
        <div id="main">
            <xsl:apply-templates select="main" />
            <xsl:call-template name="main-extended" />
       </div>
    </xsl:template>

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets -->
    <xsl:template name="main-extended" />

<xsl:template name="footer">
        <div id="footer">
        <div id="footer-inner">
        <!-- Footer content here -->
        </div>
        </div>
</xsl:template>  

Это сработало довольно красиво для меня. Если есть какие-то вопросы, на которые я могу ответить, дайте мне знать.

5 голосов
/ 03 октября 2008

Шаблоны, Включая.

Xsl очень отличается от любого другого языка программирования. Its rule based.

Я рекомендую вам прочитать что-то о Xslt, а затем спросить немного более точным.

2 голосов
/ 05 октября 2008

XSL - на основе на основе шаблонов.

Данные XML можно «повторно использовать» на трех уровнях. На самом базовом уровне вы можете <xsl:for-each /> через XML.

Примечание: For-each в XSL не выполняет циклический просмотр данных, он просто сопоставляет данные. Также, когда вы «внутри» для каждого, вы внутри этого «контекста» XML (который похож на концепцию «контекста» в программировании)

Пример использования и повторного использования for-each

<xsl:for-each select="/xml/data/here">
    ... do some stuff ...
</xsl:for-each>
<xsl:for-each select="/xml/data/here">
    ... do some DIFFERENT stuff ...
</xsl:for-each>

Узлы for-each содержатся в узлах шаблона (2-й уровень повторного использования). Существует два типа узлов шаблона: Match и Named. Совпадение шаблонов узлов, действуют как для каждого узла, упомянутого выше, но автоматически вызываются механизмом шаблонов, если какие-либо узлы совпадают, когда начинается обработка XSL. Сопоставление узлов шаблона также может быть применено явно. С другой стороны, Именованные шаблоны узлы всегда применяются явным образом и могут рассматриваться как подобные функции.

Пример шаблона соответствия, который будет всегда вызываться (потому что корневой узел всегда будет существовать)

<xsl:template match="/">
    ... do some stuff ...
</xsl:template>

Шаблон соответствия, явно вызывающий другой шаблон соответствия

<xsl:template match="/">
    <xsl:apply-templates select="xml/data/too" />
</xsl:template>

<xsl:template match="xml/data/too">
     ... do something ...
</xsl:template>

Примечание. Для работы шаблона Match должен существовать соответствующий XML-узел. Если этого не происходит, совпадения нет, поэтому вызывается шаблон , а не .

Пример именованного шаблона

<xsl:template name="WriteOut">
    ... data with NO Context Here ...
</xsl:template>

Или вызов Именованного шаблона из Соответствующего шаблона

<xsl:template match="/">
   <xsl:call-template name="WriteOut" />
<xsl:template>

Примечание: Вы можете смешивать и сопоставлять, откуда вы называете сопоставленные и именованные шаблоны, вам просто нужно посмотреть, в каком контексте вы находитесь.

Все узлы шаблона хранятся в XSL Stylesheets , и вы можете включать и import различных таблиц стилей. Например, вы можете хранить все шаблоны, относящиеся к узлам заголовка HTML, в одном шаблоне, а все шаблоны, относящиеся к узлам тела HTML, - в другом. Затем вы можете создать одну таблицу стилей, которая включает таблицы стилей заголовка и тела.

Пример узла включения

<xsl:include href="header.xsl" />

В заключение можно выделить три способа абстрагирования фрагментов данных: для каждого, с помощью шаблонов или с помощью таблиц стилей.

2 голосов
/ 03 октября 2008

Вы можете дать имена шаблонам и затем вызывать их через 'call-template'

В XSLT 2.0 вы можете создавать свои собственные функции (хотя я нахожу синтаксис извилистым)

Замечательная область для исследования - использование XSLT для генерации таблиц стилей XSLT. Это позволяет автоматизировать обычные сценарии преобразования, в которых 90% таблицы стилей составляют шаблон. Для этого вам нужно ознакомиться с «псевдонимом пространства имен». Это отличный способ расширить свои знания языка.

2 голосов
/ 03 октября 2008

Существуют операторы xsl Include и Import, которые можно использовать для абстрагирования частей страницы. XSLT сам по себе очень похож на то, что может воспроизводить поведение типа файла тега. Вы редактируете свои XML-файлы данных с тегами, которые вы хотите. Тем временем ваши xsl-шаблоны узнают, что делать с этими тегами, а затем встретятся с ними.

1 голос
/ 03 октября 2008

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

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

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