Asp.net XSLT母版页?

Asp.net XSLT母版页?,asp.net,xml,xslt,master-pages,Asp.net,Xml,Xslt,Master Pages,我正在制作一个web应用程序,其中页面是xml,它们使用xslt样式表来创建xhtml输出 因此,许多页面布局将包含在XSLT样式表中,从某种意义上说,XSLT样式表包含关于页面布局的所有公共信息,是否可以为XSLT样式表创建asp.net母版页??基本上,我会有一个生成xml的aspx页面,包括另一个aspx页面,它是一个xslt表,使用母版页插入页面上的任何内容更改[仅中间窗格] 此外,你认为这是一个好的设计策略吗?我在前世做这件事是为了一个解决方案,更具体地说,我让别人为我做了相当多的工作

我正在制作一个web应用程序,其中页面是xml,它们使用xslt样式表来创建xhtml输出

因此,许多页面布局将包含在XSLT样式表中,从某种意义上说,XSLT样式表包含关于页面布局的所有公共信息,是否可以为XSLT样式表创建asp.net母版页??基本上,我会有一个生成xml的aspx页面,包括另一个aspx页面,它是一个xslt表,使用母版页插入页面上的任何内容更改[仅中间窗格]


此外,你认为这是一个好的设计策略吗?

我在前世做这件事是为了一个解决方案,更具体地说,我让别人为我做了相当多的工作(-:

基本上,您只需要两件事,XML和XSLT,其余的只是管道,可能不需要。XSLT足以完成您想要的所有布局,因此这只是将XML连接到页面的问题

就XSLT而言,通过使用包含和内容,您可以轻松地完成母版页类型的工作,使用在特定页面类型模板中定义/覆盖的模板

我们使用的方法是使用路由和早期MVC堆栈的一些其他元素——一位拉XML,一位拉XSLT,一位代码将它们连接在一起,并将参数推送到XSLT中,最后将生成的HTML推送到客户端

如果您想了解一下,您会发现很多人通过MVC的XML/XSLT视图引擎做了一些有趣的事情


在“这是一种好方法吗”-对于特定于客户端的CMS(运行单一基因的XML文件),它非常适合我,而且基本上Umbraco是在使用XSLT呈现XML的相同前提下构建的(尽管随着Razor引入Umbraco,这种情况有所改变)。

这就是我所说的“填空”技术,是的,这是一种非常好的设计模式,它允许将表示和处理逻辑分开,并且能够有许多不同的输出格式,而无需更改转换

下面是使用此技术的完整且非常简短的示例

<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>
<person>
 <first-name>John</first-name>
 <last-name>Smith</last-name>
 <age>23</age>
 <nationality>British</nationality>
</person>
<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>
然后产生以下结果

<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>
<person>
 <first-name>John</first-name>
 <last-name>Smith</last-name>
 <age>23</age>
 <nationality>British</nationality>
</person>
<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

由浏览器显示为

<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>
<person>
 <first-name>John</first-name>
 <last-name>Smith</last-name>
 <age>23</age>
 <nationality>British</nationality>
</person>
<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


你为什么会这样做?这只是一个试验,看看是否可能?因为我看到了纯XML的web应用程序的好处。整个网站本质上是一个平台。很好的问题,+1。请参阅我的答案,了解这项技术的完整演示——一个非常基本的设计模式,显示了XSLT的功能和优雅。