在我的xsl中,已经为para,graphic等元素定义了模板。例如:
<xsl:template match="para">
<fo:block>
<xsl:apply-templates />
</fo:block>
</xsl:template>
但是我希望在特定属性值的情况下添加额外的节点。例如,如果元素的属性值为changeStatus = new,我需要在其他节点中添加“fo:change-bar-begin”元素。 示例xml:
<para changeStatus="new">
This is a paragraph that has change bars applied to the whole paragraph. </para>
输出应为:
<fo:block>
<fo:change-bar-begin change-bar-style="solid"/>
This is a paragraph that has change bars applied to the whole paragraph.
<fo:change-bar-end/>
</fo:block>
我正在使用此代码,但它会覆盖早期模板并删除其他模板中定义的节点(fo:block)。
<xsl:template match="para|graphic|attention">
<xsl:choose>
<xsl:when test="@changeStatus[.='new']">
<fo:change-bar-begin change-bar-style="solid"/>
<xsl:apply-templates />
<fo:change-bar-end/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
请建议最好的方法。
编辑:我意识到我不能对同一个元素使用两个模板匹配,这就是为什么一个覆盖另一个。我现在正在使用这个片段,但它似乎没有用。
<xsl:template match="@changeStatus[.='new']">
<fo:change-bar-begin change-bar-style="solid" change-bar-color="black" change-bar-offset="5pt" change-bar-placement="inside"/>
<xsl:apply-templates />
<fo:change-bar-end/>
</xsl:template>
答案 0 :(得分:1)
试试这个:
<xsl:template match="para|graphic|attention">
<fo:block>
<xsl:choose>
<xsl:when test="@changeStatus='new'">
<fo:change-bar-begin change-bar-style="solid"/>
<xsl:apply-templates />
<fo:change-bar-end/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates />
</xsl:otherwise>
</xsl:choose>
</fo:block>
</xsl:template>
要不更改现有模板,您可以在新模板中使用优先级
<xsl:template match="para[@changeStatus='new']" priority="10">
<fo:block>
<fo:change-bar-begin change-bar-style="solid"/>
<xsl:apply-templates />
<fo:change-bar-end/>
</fo:block>
</xsl:template>
答案 1 :(得分:1)
考虑将当前模板改为命名模板
<xsl:template name="checkStatus">
<xsl:choose>
<xsl:when test="@changeStatus='new'">
<fo:change-bar-begin change-bar-style="solid"/>
<xsl:apply-templates />
<fo:change-bar-end/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
然后,调整您的para
匹配模板(对于匹配graphic
和attention
的模板,您会这样做)
<xsl:template match="para">
<fo:block>
<xsl:call-template name="checkStatus">
</fo:block>
</xsl:template>