2014-02-27 117 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作为我发现做这种事很容易,详情很长,叹了口气。 –