我正在创建一个Web应用程序,其中页面是xml,他们使用xslt样式表来创建xhtml输出。
因此,很多页面布局都会包含在XSLT样式表中,从某种意义上说,XSLT表包含有关页面布局的所有常见信息,是否可以为xslt创建一个asp.net主页面片??基本上我有一个aspx页面生成xml并包含另一个aspx页面,这是一个xslt表单,使用母版页插入页面上的任何内容更改[仅限中间窗格]。
此外,您认为这是一个很好的设计策略吗?
答案 0 :(得分:3)
这就是我所谓的“填空”技术,是的,它是一个非常好的设计模式,允许将表示和处理逻辑分开,并且能够有多种不同的输出格式而无需改变转换。
以下是使用此技术的完整且非常简短的示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pMasterPage" select=
"'file:///c:/temp/delete17.xml'"/>
<xsl:variable name="vDoc" select="/"/>
<xsl:template match="node()|@*">
<xsl:param name="pInput"/>
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:with-param name="pInput" select="$pInput"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="document($pMasterPage)/*">
<xsl:with-param name="pInput" select="$vDoc"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="first-name|last-name|age">
<xsl:param name="pInput"/>
<xsl:value-of select="$pInput/*/*[name()=name(current())]"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档:
<person>
<first-name>John</first-name>
<last-name>Smith</last-name>
<age>23</age>
<nationality>British</nationality>
</person>
如果文件:c:\temp\delete17.xm
l包含此:
<html>
<h1>Person:</h1>
<p>First Name: <first-name/></p>
<p>Last Name: <last-name/></p>
<p>Age: <age/></p>
</html>
然后生成以下结果:
<html>
<h1>Person:</h1>
<p>First Name: John</p>
<p>Last Name: Smith</p>
<p>Age: 23</p>
</html>
由浏览器显示为:
名字:约翰
姓氏:史密斯
年龄:23
答案 1 :(得分:2)
我这样做是为了解决以前的生活 - 更具体地说,我有人为我做了相当大的一部分( - :
从根本上说,你只需要两件事,XML和XSLT - 其余的只是管道而且可能不需要。 XSLT足以完成您想要的所有布局,因此只需将XML连接到页面即可。
就XSLT而言,通过使用在特定页面类型模板中定义/覆盖的模板,使用包含和内容,您很容易获得主页类型的功能。
我们使用的方法是使用路由和早期MVC堆栈的一些其他元素 - 一点拉动XML,一点拉动XSLT,一点代码将它们连接在一起并将params推入XSLT,最后只是将结果HTML推送到客户端。
如果你有一个追逐,你会发现各种各样的人通过MVC的XML / XSLT视图引擎做了有趣的事情。
就“这是一个好方法”而言 - 对于我来说,对于客户特定的CMS(运行单一生成的XML文件)而言,它非常好用,并且从根本上说,Umbraco是在使用XSLT呈现XML的相同前提下构建的(虽然随着Razor向Umbraco的引入,这种情况有所改变。