【问题标题】:master stylesheet sharing in XSLTXSLT 中的主样式表共享
【发布时间】:2009-03-14 22:42:25
【问题描述】:

我想在 XSLT 中创建一个主模板,它可以存储在一个单独的文件中。所有其他页面样式表都使用 xsl:import 共享它。

master.xslt

 <xsl:template match="Page">
  <html>
   <head>
   </head>
   <body>

     <call-template name="Content"/>

   </body>
  </html> 
 </xsl:template>
<xsl:stylesheet>

page.xslt

<xsl:stylesheet>
<xsl:import href="master.xslt"/>

<xsl:template match="/">
  <apply-templates match="Page"/>
</xsl:template>

<xsl:template name="Content">
  ... apply something page-specific
</xsl:template>

</xsl:stylesheet>

page.xml

<Page>
 ... something page-specific
</Page>

我可以改进这个解决方案吗?

  • 我不能从主样式表开始,因为我需要 xsl:import 一切。
  • 我不希望 master.xslt 在每个特定页面上都包含引用。

另一个决定(违反 xslt 精神)可能是这样的:

master.xslt

<xsl:template name="masterHead">
 <html>
  <head>
  </head>
  <body>
</xsl:template>

<xsl:template name=masterEnd>
 </body>
 </html> 
</xsl:template>

</xsl:stylesheet>

page.xslt

<xsl:stylesheet>
<xsl:import href="master.xslt"/>

<xsl:template match="/">
  <call-template name=masterHead>
   ... apply something page-specific
  <call-template name=masterEnd/>
</xsl:template>

</xsl:stylesheet>

我们不需要任何通用根&lt;Page&gt; 元素。

【问题讨论】:

    标签: xslt


    【解决方案1】:

    使用&lt;xsl:import&gt; 是正确的设计决策。这正是该 XSLT 指令的主要用例。

    可以走得更远——查找&lt;xsl:apply-imports&gt; 指令,以及导入的样式表如何应用模板,了解其操作和含义,它绝对不知道任何事情。后者称为Higher-Order-Functions,并在XSLT 中使用FXSL library(完全用XSLT 编写)实现。

    【讨论】:

      【解决方案2】:

      这对我来说看起来很合适...与我过去使用的很常见(尽管我经常使用&lt;xsl:include/&gt;,但两者都应该可以)。我可能做出的主要改变是使匹配更加明确(至少在主 xslt 中) - 即

      <xsl:template match="/Page"> <!-- leading slash -->
      

      因此它不会意外匹配其他位置的Page 元素(例如,数据分页,如&lt;Page Index="3" Size="20"/&gt;)。

      我做的另一件事是添加一个“*”匹配,如果我没有更具体的节点匹配,则使用xsl:message 抛出错误。当您有错字等时,这会更加明显。

      【讨论】:

      • A 前导 / 实际上不是一个好的决定。 @match 属性的值是一个“匹配模式”,因此它不需要是绝对的 XPath 表达式。将模板应用到哪些节点取决于选择它的 的(动态)上下文。
      • @Dimitre:如果您只希望它匹配根 Page 元素,这是个好主意。
      【解决方案3】:

      我真的很高兴找到这个示例,因为我一直在寻找验证这实际上是主/从模板设置的正确方法。 但是,提供的示例在 tomcat 上无法开箱即用 - 因此,为了帮助只知道如何在此处复制粘贴的其他人,我们提供了一组有效的 tomcat 主/从文件。

      Master.xsl:

      <?xml version="1.0" encoding="iso-8859-1" ?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="xml" encoding="iso-8859-15" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" indent="no"/>
      <!-- http://stackoverflow.com/questions/646878/master-stylesheet-sharing-in-xslt -->
       <xsl:template match="ms247">
        <html>
         <head>
          <title>test</title>
         </head>
      
         <body>
          <div style="border: 1px solid black; width: 200px; float: left; margin: 10px; padding: 5px;">
           <xsl:call-template name="left"/>
          </div>
          <div style="border: 1px solid black; width: 200px; float: left; margin: 10px; padding: 5px;">
           <xsl:call-template name="content"/>
          </div>
          <div style="border: 1px solid black; width: 200px; float: left; margin: 10px; padding: 5px;">
           <xsl:call-template name="right"/>
          </div>
         </body>
        </html>
       </xsl:template>
      
      
       <xsl:template name="content">
        <span style="color: red">Content template is empty - overrule in page template.</span>
       </xsl:template>
      
       <xsl:template name="left">
        <span style="color: red">Left template is empty - overrule in page template.</span>
       </xsl:template>
      
       <xsl:template name="right">
        <span style="color: red">Right template is empty - overrule in page template.</span>
       </xsl:template>
      </xsl:stylesheet>
      

      还有slave.xsl:

      <?xml version="1.0" encoding="iso-8859-1" ?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:import href="master.xsl"/>
      
       <xsl:template name="content">
        ... apply something page-specific
       </xsl:template>
      
       <xsl:template name="right">
        And we have RIGHT content!
        <!-- Execute matching template which is NOT triggered automatically -->
        <xsl:apply-templates select="params/param"/>
       </xsl:template>
      
       <!-- And we do not define any left template -->
      
       <!-- Example -->
       <xsl:template match="ms247/params/param">
        Paramters on page: <xsl:value-of select="@name"/><br/>
       </xsl:template>
      </xsl:stylesheet>
      

      希望这可以帮助其他人 - 不要害羞给我留言。

      【讨论】:

        猜你喜欢
        • 2013-05-15
        • 1970-01-01
        • 2014-12-03
        • 2018-11-07
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 1970-01-01
        相关资源
        最近更新 更多