Я изучаю мем XML -> XSLT -> HTML для создания веб-контента. У меня очень мало опыта работы с XSLT.
Мне любопытно, какие механизмы доступны в XSLT для обработки абстракций или «рефакторинга».
Например, с общим HTML и включением на стороне службы многие страницы могут быть шаблонизированы и разложены на те места, где есть, скажем, общие сегменты заголовка, навигации и нижнего колонтитула, а сама страница в основном является телом.
Общие языки разметки, JSP, PHP, ASP, позволяют всем этим сегментам иметь динамическое содержимое (например, добавление имени пользователя в каждый блок заголовка).
JSP идет еще дальше, позволяя создавать файлы тегов, которые могут принимать аргументы, которые будут использоваться при генерации содержимого, и даже окружать содержимое и работать с ним внутри самих тегов.
Мне любопытно, что подобная функциональность реализована в XSLT. Какие есть средства для создания многоразового блока XSLT для таких вещей, как создание HTML-страниц?






Шаблоны, Включает.
Xsl сильно отличается от любого другого языка программирования. Its rule based.
Я рекомендую вам прочитать что-нибудь о Xslt, а затем спросить немного подробнее.
Все учебные пособия и тому подобное, что я видел, имеют дело с XSLT «в малом», с упором на синтаксис и т.д.
Существуют операторы xsl Include и Import, которые можно использовать для абстрагирования частей страницы. XSLT во многом может воспроизводить поведение типа файла тега. Вы редактируете свои XML-файлы данных с нужными тегами. Между тем, ваши xsl-шаблоны будут знать, что делать с этими тегами, когда они столкнутся с ними.
Вы можете дать шаблонам имена, а затем вызывать их через call-template.
В XSLT 2.0 вы можете создавать свои собственные функции (хотя я считаю синтаксис извилистым)
Замечательная область для изучения - использование XSLT для создания таблиц стилей XSLT. Это позволяет автоматизировать распространенные сценарии преобразования, в которых 90% таблицы стилей являются шаблонными. Для этого вам необходимо познакомиться с «псевдонимом пространства имен». Это отличный способ расширить свои знания языка.
Мне потребовалось принять душ, чтобы понять, что вы здесь говорите о XSLT -> XSLT, но я наконец понял это. Это тоже очень умно. Если XSLT недостаточно абстрактен для вас, поскольку это просто XML, сделайте его более абстрактным. «Будет писать код, который пишет код, который пишет код для еды», как говорится. Спасибо.
Не беспокойтесь - дайте мне знать, если вам нужен пример
В моем собственном проекте я разделил свои страницы так. Был импортирован файл 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>
У меня это сработало очень красиво. Если есть какие-либо вопросы, на которые я могу ответить для вас, дайте мне знать.
Это превосходно и именно то, что я искал, спасибо.
Мне нравится этот ответ. Еще немного информации: если вы хотите поместить некоторые шаблоны во внешние файлы, одним из возможных решений является Xinclude <w3.org/TR/xinclude>
XSLT - мощный инструмент, но он сильно отличается от большинства языков программирования и весьма ограничен в том, что делает вам доступным, поэтому для работы с вещами, встроенными в другой язык, могут потребоваться довольно сложные манипуляции с xsl. Я нашел шпаргалка отсюда полезным, когда пару недель назад выполнял много работы с XSLT.
Не ожидайте, что XSLT будет делать что-то определенным образом, и вы, вероятно, сможете найти хорошие способы для этого, но если у вас слишком много четкого представления о том, как что-то должно работать, легко застрять.
Это всегда вызов. Вы берете свой предыдущий опыт и пытаетесь применить его к чему-то новому. Я знаю, что у XSLT другой взгляд на мир, но я также знал, что с его помощью люди должны решать аналогичные проблемы, и мне было любопытно, как они это сделали.
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" />
В заключение есть три способа абстрагирования блоков данных: для каждого, с помощью шаблонов или включения таблиц стилей.
"мем"? Я не думаю, что это означает то, что вы думаете ...