如何在保留其子元素的同时删除父标签

时间:2019-02-15 12:26:08

标签: xml xslt

如果子标签和父标签的顺序不符合预期,如何在保留其子标签的同时删除父标签?

xml输入是:

<div>
<b>
<a>correct info</a>
</b>
</div>
<div>
<b>
<a>additional info</a>
<i>italic form</i>
</b>.

<xsl:template match="b/a">
       <xsl:copy-of select="a"/>
    </xsl:template>

实际结果是:

<div> 
<b/>
</div>
<div>
</b>
<i>italic form</i>
</div>

预期结果:

    <div>
    <a>correct info</a>
    </div>
    <div>
    <a>additional info</a>
    <i>italic form</i>
</div>

2 个答案:

答案 0 :(得分:0)

代替:

<xsl:template match="b/a">
   <xsl:copy-of select="a"/>
</xsl:template>

尝试:

<xsl:template match="b">
   <xsl:copy-of select="a"/>
</xsl:template>

答案 1 :(得分:0)

如果您有特定元素'a'作为'b'的子元素,那么michael.hor的解决方案有效。 id您可以将任何元素作为子元素。 例如,在这里您有一个a和i作为b的孩子

<xsl:template match="b">
    <xsl:apply-templates select="@* | node()" mode="suppress"/>       
</xsl:template>


<xsl:template match="@* | node()[not(self::b)]" mode="suppress">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()" mode="suppress"/>
  </xsl:copy>
</xsl:template>


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