2011-05-27 78 views
0

我目前正在为一些查找艾滋病的XSL样式表工作,但我相信我在样式表中的多个模板之间有冲突。诚然,我对XSL相当陌生,所以我可能在这里错过了一些东西。我希望我已经包含了所有必要的细节。XSL-多模板冲突?

这里是我想要的模板要遵循代码:

<c05 level="item"><did><unittitle><title render="italic">Souvenir</title>, undated</unittitle></did> 
<scopecontent> 
<p>With sketches of Confederate Generals and Confederate flags and a <emph render="doublequote">bird's eye view</emph> of Charleston.</p> 
</scopecontent> 
</c05>  

现在,问题的格式2个模板我的容器分别列出的布局和一些文本格式。布局模板如下:

<xsl:template name="item"> 

<xsl:variable name="title"> 

<xsl:if test="did/unitid"> 
<xsl:value-of select="did/unitid"/><xsl:text>.&#8201;</xsl:text> 
</xsl:if> 

<xsl:value-of select="did/unittitle"/> 

<xsl:if test="did/unitdate"> 
<xsl:text>,&#8201;</xsl:text><xsl:value-of select="did/unitdate"/> 
</xsl:if> 

</xsl:variable> 


<div style="margin-left:80px; padding-top:10px;"><xsl:value-of select="$title" /></div> 


<div class="c01sc" style="margin-left:80px;"><xsl:value-of select="scopecontent" /></div> 


<xsl:element name="a"> 
<xsl:call-template name="addidtoc"/> 
</xsl:element>   

</xsl:template> 

这里是文本格式的代码。它调用另一个模板执行一些格式化:

<xsl:template match='emph'> 
    <xsl:call-template name='render'/> 
</xsl:template> 

<xsl:template name='render'> 
    <xsl:choose> 
    <xsl:when test="@render='italic'"> 
     <xsl:element name="i"> 
      <xsl:call-template name="addid"/> 
      <xsl:apply-templates/> 
     </xsl:element> 
     </xsl:when> 

etc..... 

</xsl:template> 

问题是,只有第一个布局模板的操作正在执行。我的布局样式是生成的,但由于emph标签应该在双引号中的区域仍然很简单。这是模板层次结构的问题,还是我做了一些完全错误的事情?希望这是有道理的。我会很感激我能得到的任何帮助!

+1

你可以发布你获得的输出和你想要的输出吗? – 2011-05-27 18:49:12

+3

也许有用也有第二个模板的完整代码。 – 2011-05-27 18:51:48

回答

0

只有在使用xsl:call-template显式调用命名模板时,才会调用命名模板。只有在选择与xsl:apply-templates指令中匹配的节点时,才会调用模板规则(其中一个具有匹配属性)。这应该解释为什么你的模板没有执行。

+0

我明白你的意思了。我在代码中移动了一些东西,现在布局的“item”模板和用于格式化的“render”模板都会在找到各自的匹配项后调用。但即使如此,只调用了“项目”布局模板。 “项目”模板带来的样式可能会覆盖格式渲染吗? – librarion 2011-05-31 15:59:04