将节点属性复制到父节点

时间:2010-09-08 14:13:07

标签: php xml xslt

我正在使用PHP5,我需要以下列形式转换XML:

<section>
      <heading>
            <line absolutePage="4" page="2" num="35">A Heading</line>
      </heading>
      <subsection type="type1">
            <heading label="3">
                  <line absolutePage="4" page="2" num="36">A Subheading</line>
            </heading>
            <content/>
      </subsection>
</section>

这样的事情:

<section name="A Heading">
      <heading>
            <line absolutePage="4" page="2" num="35">A Heading</line>
      </heading>
      <subsection type="type1" label="3" name="A Subheading">
            <heading label="3">
                  <line absolutePage="4" page="2" num="36">A Subheading</line>
            </heading>
            <content/>
      </subsection>
</section>

请注意,label属性已从heading属性复制到父元素。

此外,heading/line元素的文本已添加为heading父节点的属性。

1 个答案:

答案 0 :(得分:3)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="subsection">
        <subsection label="{heading/@label}" name="{heading/line}">
            <xsl:apply-templates select="@*|node()"/>
        </subsection>
    </xsl:template>
    <xsl:template match="section">
        <section name="{heading/line}">
            <xsl:apply-templates select="@*|node()"/>
        </section>
    </xsl:template>
</xsl:stylesheet>

输出:

<section name="A Heading">
    <heading>
        <line absolutePage="4" page="2" num="35">A Heading</line>
    </heading>
    <subsection label="3" name="A Subheading" type="type1">
        <heading label="3">
            <line absolutePage="4" page="2" num="36">A Subheading</line>
        </heading>
        <content></content>
    </subsection>
</section>

注意:只要可以使用文字结果元素和属性值模板,就可以使用它。这使代码紧凑而快速。如果您想要更一般的答案,请澄清一下。

修改:错过section/@name。当然,如果空字符串section/@label没有打扰你,你可以使用section|subsection模式匹配。