2014-02-27 50 views
1

我有一個XSL樣式表,我需要使用它,因爲它具有很難重新創建的東西。而且我也無法編輯它。所以我使用<xsl:import>來導入XSL樣式表,然後我重寫了一些模板。但是,一個有我難住了:重寫XSL調用模板

<xsl:template match="mscript"> 
<html> 
    <!-- head --> 
    <head> 

     <!-- ... other stuff not important ... --> 

     <xsl:call-template name="stylesheet"/> 
    </head> 
    <body> 
     <!-- ... more stuff ... --> 

stylesheet模板,堅持在<style type='text/css'>...</style>標記,主要是有用的,開始與這個愚蠢的廢話:

<xsl:template name="stylesheet"> 
    <style type="text/css"> 
    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre, 
    a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp, 
    small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset, 
    form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td 
    {margin:0;padding:0;border:0;outline:0;font-size:100%; 
     vertical-align:baseline;background:transparent}  

哎呀!令我噁心。

我可以在我的根XSL文件中完全覆蓋樣式表,但是我真正想做的只是將這一個CSS規則取消。

有沒有辦法做到這一點?這裏有一種想什麼,我做的事:

<xsl:template name="stylesheet"> 
    <xsl:call-template name="imported_stylesheet" /> 
    <style type="text/css"> 
     <!-- nullify the boneheaded nonsense --> 
    h1,h2,h3,h4,h5,h6,p,blockquote,pre, 
    a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp, 
    small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset, 
    form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td 
    {margin: default; padding:default;border:default;outline:default;font-size:default; 
     vertical-align:default;background:default}  
    </style> 
</xsl:template> 

default不是一個CSS功能,我不知道如何調用導入的樣式表,因爲當我重寫stylesheet模板,其以前價值消失。

回答

2

我相信CSS目前還沒有一種方法來重置風格的瀏覽器的默認值(見Reset CSS display property to default value

我能想到的做你想要達到什麼樣的一個非常「粗糙」的方式。假設樣式單模板只返回一個樣式元素,您可以將調用:template命令包裝在變量中,然後只刪除第一個規則。像這樣的東西

<xsl:variable name="style"> 
    <xsl:call-template name="stylesheet"/> 
</xsl:variable> 
<style type="text/css"> 
    <xsl:value-of select="substring-after($style, '}')" /> 
</style> 

這只是第一個之後的CSS規則。

你確定你不能編輯導入的樣式表嗎?難道你不能追捕寫它的人,並要求他們改變它以允許一個參數指定你是否想要第一個規則?或者,也許你可以只拿一份導入的樣式表,並改變它爲你自己的目的....

+1

好的答案。一些額外的信息:如果你重寫了一個命名模板,那麼很遺憾沒有辦法調用原來的(直到XSLT 3.0!)。這可能是在執行原始樣式表之前運行轉換的情況。 –

+0

我正在處理現成的糟糕的HTML報告生成框架。正確的做法是讓我放棄整個該死的事情,但我現在無法花時間去創建替代品:-(當我得到時間時,我可能會使用Python + Markdown作爲我發現做這種事很容易,詳情很長,嘆了口氣。 –