2010-03-03 30 views
1

我在XSLT import/include中有一个有趣的问题。xslt导入/包含2个具有相同模板的文件

我有2个XSLT文件具有相同的规则。

收据XSLT:(由其自身运行)

<xsl:template match="Booking" mode="extraStyle"> 
<link rel="stylesheet" href="../css/receipt.css" type="text/css" media="screen"/> 
</xsl:template> 

EmailCommon XSLT:(作为模板库的电子邮件文档,自身并不经营)

<xsl:template match="Booking" mode="extraStyle"> 
    <link rel="stylesheet" href="../css/email.css" type="text/css" media="screen"/> 
</xsl:template> 

所以这取决于文档类型I插入正确的CSS文件。

我想要做的就是对这两个文件包含到另一个XSLT:

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
exclude-result-prefixes="msxsl" 
version="1.0"> 

<xsl:include href="receipt.xsl"/> 
<xsl:include href="email.xsl"/> 

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

然而,因为规则是相同的两个样式包括它归结为最后的规则,我最终只包括email.css。

我想知道在这种情况下是否可以做一些聪明的事情?

我在想的唯一的事情就是使用不同的模式,但它不会那么直观,而是会对所有相同规则的代码进行准确计算。不知道如何以及是否可以在XSLT中完成。

感谢您的帮助!

P.S.对不起,我真的想了解本网站上的格式化规则,但我根本无法:(gggrrr

+0

你必须定义您希望在哪种情况下运行一个模板,以及在哪种情况下运行另一个模板? – Tomalak 2010-03-03 12:49:30

+0

@Tomalak,问题是,在包含receipt.xsl和email.xsl的样式表中(这只是一个模板库)我希望这两个模板都能被执行,但根据最后一条规则,为最新的包含样式表执行相同的模板,ei for email.xsl。 我想知道是否有一个聪明的方法来确保可以执行receipt.xsl和email.xsl中的两个模板。或者我需要使用不同的模式? 它有道理吗? – DashaLuna 2010-03-03 15:20:27

+0

'mode'属性在现有代码中有什么作用;这就是为什么两个模板都是用mode ='extraStyle'定义的。他们是如何被调用的? – 2010-03-03 15:46:20

回答

2

我觉得做模板模式不同的是你的最佳选择。

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    exclude-result-prefixes="msxsl" 
> 

    <xsl:include href="receipt.xsl"/> 
    <xsl:include href="email.xsl"/> 

    <xsl:template match="Booking"> 
    <xsl:apply-templates select="." mode="extraStyleReceipt" /> 
    <xsl:apply-templates select="." mode="extraStyleEmail" /> 
    </xsl:template> 

</xsl:stylesheet> 
相关问题