【发布时间】:2010-08-15 05:16:02
【问题描述】:
我正在重建我们网站的 UI 部分,该部分完全基于 javascript/ajax(没有充分的理由并且以相当低效的方式),以便后端现在可以完成大部分内容生成。它是一个 C# .net 应用程序。
几乎我们所有的页面(可能有 40-50 页)都具有相同的基本布局。我是 XSLT 的新手,但我已经使用 MVC 框架完成了很多工作,例如 Spring(java,使用 Sitemesh 进行布局)、Symfony (PHP)、一些 rails 以及其他一些框架。我喜欢拥有一个或多个通用模板的能力,然后拥有一个特定的“内容”部分,页面特定的东西可以放在其中。我无法弄清楚这是如何使用 XSLT 完成的。在这个应用程序的情况下,我在支持 xslt 页面的 xml 中有一个可用的值,我们称之为 ContentXSL,它的值是 xsl 文件的名称 我想用于页面的内容部分。我知道这是不可能的,但它会很好用:
<xsl:call-template name="{$ContentXSL}" />
然后我可以简单地把它放在内容部分。但是这是不可能的,所以我需要一个基于 ContentPage 变量调用正确模板的大量选择语句。这也意味着在我的布局中。 xsl 文件我必须包含所有 40-50 个 xsl 文档。我认为开销会很大,但我不确定。如果网站获得大量流量,这样做是否合理?
还有哪些其他常见的方法?似乎大多数现代框架都允许您使用这种模式来装饰内容。在 Symfony 的情况下,它运行得非常好并且非常灵活(有插槽等等)。
我知道另一种可能的解决方案是拥有 40 个独立文件,这些文件都具有相似的标记并包括页眉和页脚等特殊部分。这意味着如果我想更改网站布局的整体结构,我必须编辑所有 40-50 个页面(非常烦人)。
更新 -- 更多解释
我想进一步解释这一点,因为我有一些需要大量工程才能改变的要求。 首先,后端将传递给我一些 xml,它会让我知道查询 args 在网站的 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>
现在,对于此页面的内容,我将拥有以下文件: 博客/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:choose 来选择正确的那个)。 我不确定如何将 FXSL 方法应用于手头的问题。 请注意,我不会反对使用 sitemesh 类型的方法,我指定了 html/body 标记以及子项中的所有内容,并让它将我在子项的 body 部分中的内容替换为布局的内容 div(另外,如果子中有一个标题标签替换布局中的标题标签——类似的东西)。
【问题讨论】:
-
好问题 (+1)。有关完整且广泛支持的解决方案,请参阅我的答案。 :)