2010-03-03 31 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> 
相關問題