XSLT-абстракции

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

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

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

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

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

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

"мем"? Я не думаю, что это означает то, что вы думаете ...

annakata 20.12.2008 00:30
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
10
1
5 168
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

Все учебные пособия и тому подобное, что я видел, имеют дело с XSLT «в малом», с упором на синтаксис и т.д.

Will Hartung 03.10.2008 20:48

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

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

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

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

Мне потребовалось принять душ, чтобы понять, что вы здесь говорите о XSLT -> XSLT, но я наконец понял это. Это тоже очень умно. Если XSLT недостаточно абстрактен для вас, поскольку это просто XML, сделайте его более абстрактным. «Будет писать код, который пишет код, который пишет код для еды», как говорится. Спасибо.

Will Hartung 03.10.2008 20:45

Не беспокойтесь - дайте мне знать, если вам нужен пример

Garth Gilmour 03.10.2008 23:58
Ответ принят как подходящий

В моем собственном проекте я разделил свои страницы так. Был импортирован файл 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 выйдет из строя, если page вызывает шаблон, но нигде его не определяет.

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

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

Это превосходно и именно то, что я искал, спасибо.

Will Hartung 03.10.2008 20:41

Мне нравится этот ответ. Еще немного информации: если вы хотите поместить некоторые шаблоны во внешние файлы, одним из возможных решений является Xinclude <w3.org/TR/xinclude>

bortzmeyer 22.12.2008 11:45

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

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

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

Will Hartung 03.10.2008 20:43

XSL - это исходя из при создании шаблонов.

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

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

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

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

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

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

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

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

<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, и вы можете использовать различные таблицы стилей включают и импорт. Например, вы можете хранить все шаблоны, имеющие дело с узлами заголовка HTML, в одном шаблоне и все шаблоны, имеющие дело с узлами тела HTML, в другом. Затем вы можете создать одну таблицу стилей, которая включает таблицы стилей заголовка и тела.

Пример включаемого узла

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

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

Другие вопросы по теме