我最近问了一个关于使用 XSL/t 创建站点布局和子页面的问题Here .. 布局将在哪里装饰子页面。我想扩展这个想法并提出类似 SiteMesh 的功能。请注意,我将有非常少量的 xsl 布局文件,我的大部分 xsl 文件应该用于子页面。布局相当基本,它包括页眉、主菜单、页脚、正文在它下面有一个内容 div。SiteMesh 允许您将模板文件定义为相当标准的 html 文件,然后将子页面定义为将覆盖父页面的部分。例如,这是一个站点网格的基本模板(装饰器):
<%@ taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<head>
<title>
<decorator:title default="SiteMesh Tutorial Example" /> - Site Title
</title>
<style type="text/css">@import "css/global.css";</style>
<decorator:head />
<body>
<div id="header">
<h2><a href="http://www.my-site.com/">Mysite.com</a> goes here</h2>
</div>
<div id="content">
<decorator:body />
</div>
</body>
</html>
然后这是一个子页面的示例:
<html>
<head>
<title>Child Page</title>
<style type='text/css'>
p { margin: 10 }
</style>
</head>
<body>
Content Goes here
</body>
</html>
一旦装饰器应用于子页面,结果将包含装饰器:主体所在的子页面的主体 ,装饰器:头部也被替换,等等。它的工作原理非常简单,而且相当有效组织一个网站。
所以现在假设我们正在使用 XSL/T,并且我们希望使用类似的结构,我们不会不断重新定义布局的外观,而是希望只定义一次(或者对于那些不是的页面可能定义几次) t 非常相似),如果子模板有它们,我们将替换掉它们。听起来这很简单,但问题是支持该站点的数据看起来像(不是真正的博客站点,只是作为我正在处理的示例)
<xml>
<section>Blogs</section>
<page>UserBlogs</page>
<data>
<blogs>
<blog>
<title>First Blog</title>
<author>John Doe</author>
<description>...</description>
</blog>
</blogs>
</data>
</xml>
所以现在假设我有一个这样的主模板:
<html>
<head>
<title><!-- replace this with child title --> - Site Title</title>
<script src="common-scripts.js"></script>
<style type="text/css">@import "common.css" </style>
<!-- insert everything in the child <head> here except the title -->
</head>
<body>
<div id="header">Header/log that stuff here</div>
<div id="menu">
<ul><li><a href="#">Cat 1</a></li><li><a href="#">Cat 2</a></li></ul>
</div>
<div id="content">
<!-- replace this with everything between <body>...</body> in the child -->
</div>
<div id="footer">My Site, copyright, bla bla</div>
</body>
</html>
那么我想要做的是从上面获取那个xml(关于博客的那个)并将其应用到我的子页面,然后获取该转换的结果并将其应用到我的主模板(它将根据需要复制/应用元素)。我不确定是否有办法在一次转换中做到这一点。目前的架构是这样的,我提供了如图所示的 xml,我必须将它构建到一个页面中。我想也许我可以让主模板包含子模板,然后使用 xsl:call-template 包裹一个 xsl:variable 声明来捕获当前 xml 上子模板的结果。我需要以某种方式获取该转换的结果来替换主模板的标题/标题/内容部分。
知道如何做到这一点吗?
我在这个网站上看到:http: //www.devguru.com/technologies/xslt/quickref/xslt_element_calltemplate.html 你可以在 xsl:variable 声明中捕获 xsl:call-template 的结果我只是很困惑如何然后,除了输出数据之外,您还可以使用该数据..
任何帮助,将不胜感激