XSLT - 在父元素上移动子元素

时间:2017-10-23 09:58:00

标签: xml xslt

我的输入XML就是这样,

<figure id="c001_f001" counter="yes">
<subfigure>
<graphic position="center" fileref="images/9781626237896_c001_f001.jpg"/>
<legend><para><emph type="bold">Fig. 1-1</emph>Hypertrophic scar.</para></legend>
</subfigure>
</figure>
......
......
<figure id="c001_f002" counter="yes">    
<subfigure>
<graphic position="center" fileref="images/9781626237896_c001_f002a.jpg"/>
</subfigure>
<subfigure>
<graphic position="center" fileref="images/9781626237896_c001_f002b.jpg"/>
<legend><para><emph type="bold">Fig. 1-2</emph>Keloid scar.</para></legend>
</subfigure>
</figure>

输出应该是,

<figure id="c001_f001" counter="yes">
<legend><para><emph type="bold">Fig. 1-1</emph>Hypertrophic scar.</para></legend>
<subfigure>
<graphic position="center" fileref="images/9781626237896_c001_f001.jpg"/>
</subfigure>
</figure>.......  
<figure id="c001_f002" counter="yes">    
<legend><para><emph type="bold">Fig. 1-2</emph>Keloid scar.</para></legend>
<subfigure>
<graphic position="center" fileref="images/9781626237896_c001_f002a.jpg"/>
</subfigure>
<subfigure>
<graphic position="center" fileref="images/9781626237896_c001_f002b.jpg"/>
</subfigure>
</figure>

XSLT已写成,

<xsl:template match="subfigure">
<xsl:copy-of select="legend"/>
<xsl:copy>
<xsl:apply-templates select="node() except legend"/>
</xsl:copy>
</xsl:template>

使用上面的xslt“legend”元素时,第一个实例正确显示。对于第二个实例,它出现在2个“子图”元素之间。但是,“图例”元素应显示在元素下。你能否指导我们纠正这个问题。

1 个答案:

答案 0 :(得分:0)

<legend>需要成为<figure>的孩子,可以通过以下模板完成。

<xsl:template match="figure">
    <xsl:copy>
        <xsl:copy-of select="subfigure/legend" />
        <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
</xsl:template>

<legend>需要从<subfigure>中删除{<1}},这可以通过

完成
<xsl:template match="subfigure">
    <xsl:copy>
        <xsl:apply-templates select="*[not(self::legend)]" />
    </xsl:copy>
</xsl:template>