将多个 XML 标签重命名为不同的名称

Rename Multiple XML tags to different name

我想将标签转换为其他格式,但它只转换父标签而不是子标签。 我想在不改变结构的情况下转换标签。

例如:

<section name="ABC">
    <section name="123">
        <p>Data</p>
        <p>Data</p>
        <p>Data</p>
    </section>
    <section name="456">
        <table>
            <tr>
                <td><p>Data</p></td>
                <td><p>Data</p></td>
                <td><p>Data</p></td>
            </tr>
        </table>
    </section>
    <section name="232">
      <bold><p>Data</p></bold>
    </section>
</section>

<div class="ABC">
    <div class="123">
        <h1>Data</h1>
        <h1>Data</h1>
        <h1>Data</h1>
    </div>
    <div class="456">
        <table>
            <tr>
                    <td><h1>Data</h1></td>
                    <td><h1>Data</h1></td>
                    <td><h1>Data</h1></td>
            </tr>
        </table>
    </div>
    <div class="232">
        <bold><h1>Data</h1></bold>
    </div>
</div>

这是我在 XSLT 转换中写的。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:strip-space elements="*"/>
        <xsl:template match="section"><div><xsl:apply-templates select="node()"/></div></xsl:template>
        <xsl:template match="p"><p><xsl:apply-templates select="node()"/></p></xsl:template>
        <xsl:template match="table"><table><xsl:apply-templates select="node()"/></table></xsl:template>
        <xsl:template match="row"><tr><xsl:apply-templates select="node()"/></tr></xsl:template>
        <xsl:template match="cell"><td><xsl:apply-templates select="node()"/></td></xsl:template>
        <xsl:template match="image"><img><xsl:apply-templates select="node()"/></img></xsl:template>
        
        <xsl:template match="/">
              <html>
              <body>
              <xsl:apply-templates/>
              </body>
              </html>
        </xsl:template>
</xsl:stylesheet>

一切正常,但所有属性都在计时我只获得标签而不是属性值。我想应用所有要保留的属性并单独更改特定属性的名称。

应该完成工作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:template match="section"><div><xsl:apply-templates select="@*|node()"/></div></xsl:template>
    <xsl:template match="p"><h1><xsl:apply-templates select="@*|node()"/></h1></xsl:template>
    <xsl:template match="table"><table><xsl:apply-templates select="@*|node()"/></table></xsl:template>
    <xsl:template match="row"><tr><xsl:apply-templates select="@*|node()"/></tr></xsl:template>
    <xsl:template match="cell"><td><xsl:apply-templates select="@*|node()"/></td></xsl:template>
    <xsl:template match="image"><img><xsl:apply-templates select="@*|node()"/></img></xsl:template>
    <xsl:template match="@name"><xsl:attribute name="class"><xsl:value-of select="."/></xsl:attribute></xsl:template>
    <!-- identity transformation -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>