我正在使用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
父节点的属性。
答案 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
模式匹配。