如何在特定属性值

时间:2017-10-10 10:05:35

标签: xml xslt

在我的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>

2 个答案:

答案 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匹配模板(对于匹配graphicattention的模板,您会这样做)

<xsl:template match="para">    
   <fo:block>
      <xsl:call-template name="checkStatus">             
   </fo:block>
</xsl:template>