Абстракции XSLT

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

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

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

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

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

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

Ответ 1

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

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

Это фрагмент из моего шаблона .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>  

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

Вы можете указать имена шаблонов, а затем вызвать их через "call-template"

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

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

Ответ 5

XSL основан на на при шаблонизации.

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

Примечание. Для каждого из XSL не выполняется циклическое перемещение данных, оно просто соответствует данным. Также, когда ваш "внутри" для каждого из вас внутри "контекста" XML (который похож на концепцию "scope" в программировании)

Пример использования и повторного использования для каждого

<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>

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

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

<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>

Примечание. Чтобы шаблон соответствия работал, XML node он должен соответствовать. Если это не соответствует совпадению, так что шаблон не.

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

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

Или вызов Именованного шаблона из шаблона с совпадением

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

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

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

Пример включения node

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

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

Ответ 6

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

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