Я работаю над перестройкой пользовательского интерфейса нашего веб-сайта, который полностью основан на javascript / ajax (без веской причины и довольно неэффективным образом), так что бэкэнд теперь будет выполнять большую часть генерации контента.Это приложение на C # .net.
Почти все наши страницы (которых, вероятно, 40-50 страниц) имеют одинаковый базовый макет.Я новичок в XSLT, но я проделал большую работу с фреймворками MVC, такими как Spring (java, используя Sitemesh для разметки), Symfony (PHP), немного рельсов, а также несколько других.Мне нравится иметь возможность иметь один или несколько общих шаблонов, а затем иметь определенный раздел «контент», в который попадает материал, относящийся к конкретной странице.Я не могу понять, как это сделать с XSLT.В случае этого приложения у меня есть значение, доступное мне в xml, поддерживающем страницу xslt, давайте назовем его ContentXSL, значение которого является именем файла xsl, который я хочу использовать для раздела содержимого страницы.Я знаю, что это невозможно, но было бы неплохо использовать:
<xsl:call-template name="{$ContentXSL}" />
Тогда я мог бы просто поместить это в раздел контента. Однако это невозможно, поэтому вместо этого мне понадобится массивный оператор выбора.это вызывает правильный шаблон, основанный на переменной ContentPage. Это также означает, что в моем файле Layout.xsl мне нужно будет включить все 40-50 документов xsl. Я думаю, что издержки будут довольно большими, но я не увереноб этом.Разумно ли это делать, если сайт получает много трафика?
Каковы другие распространенные способы сделать это?Похоже, что большинство современных фреймворков позволяют использовать этот шаблон для украшения контента.В случае Symfony он работал очень хорошо и был довольно гибким (со слотами и всем этим).
Я знаю, что другое потенциальное решение - это иметь 40 независимых файлов, которые имеют одинаковую разметку и включают специальные разделы, такие какВерхний и нижний колонтитулы.Это означает, что если я хочу изменить общую структуру макета моего сайта, мне придется редактировать все 40-50 страниц (очень раздражает).
Обновление - Больше объяснений
Я хочу дополнительно объяснить это, потому что у меня есть определенные требования, которые потребуют значительных технических изменений.Во-первых, бэкэнд передаст мне какой-то xml-файл, который сообщит мне об аргументах запроса в URL веб-сайта. Кроме того, он передаст мне данные, необходимые для построения моей страницы (данные вформа бизнес-данных, без HTML или что-то подобное).Данные выглядят примерно так:
<xml>
<section>Blogs</section>
<page>showAll</section>
<data>
<blogs>
<blog>
<author>somebody</author>
<title></title>
<content>..</content>
</blog>
</blog>..</blog>
</blogs>
</data>
</xml>
Теперь нам нужно иметь шаблон страницы, подобный этому:
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
<xsl:output omit-xml-declaration='yes' method='html' media-type='text/html' indent='yes' />
<xsl:include href="Header.xsl"/>
<xsl:include href="Nav.xsl"/>
<xsl:template name='MainLayout' match='*'>
<html>
<head>
<title></title>
</head>
<body>
<div id="header"><xsl:call-template name="Header" /></div>
<div id="nav"><xsl:call-template name="Nav" /></div>
<div id="content">
[here is where i want to use the xsl from {/xml/section}/{/xml/page}.xsl]
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Теперь для содержания этой страницы у меня будет следующееfile: Blogs / showAll.xsl
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
<xsl:output omit-xml-declaration='yes' method='html' media-type='text/html' indent='yes' />
<xsl:template name='Blogs_ShowAll'>
<div id="blogs-showAll">
..iterate over /xml/data/blogs converting to html
</div>
</xsl:template>
</xsl:stylesheet>
Решения до сих пор были хорошими, но я смог полностью переварить только одно из них (то, в котором упоминаются все файлы xsl и использование xsl: selectвыбрать правильный).Я не уверен, как применить метод FXSL к рассматриваемой проблеме.Обратите внимание, что я не буду возражать против использования подхода типа sitemesh, в котором я указываю теги html / body и все это в дочернем элементе, чтобы он заменял то, что у меня есть в разделе body дочернего элемента, на div содержимого макета (также, еслив дочернем элементе есть тег заголовка, замените тег заголовка в макете - все в таком духе).