如何使用XSLT重命名XML标签

25

这是我的 XML-

<CATALOG>
    <NAME>C1</NAME>
    <CD>
        <NAME>Empire Burlesque</NAME>
        <ARTIST>Bob Dylan</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>Columbia</COMPANY>
        <PRICE>10.90</PRICE>
        <YEAR>1985</YEAR>
    </CD>
    <CD>
        <NAME>Hide your heart</NAME>
        <ARTIST>Bonnie Tyler</ARTIST>
        <COUNTRY>UK</COUNTRY>
        <COMPANY>CBS Records</COMPANY>
        <PRICE>9.90</PRICE>
        <YEAR>1988</YEAR>
    </CD>
</CATALOG>

我想把目录中的 NAME 标签替换为 CATALOG-NAME,将 CD 中的 NAME 标签替换为 CD-NAME,使我的 XML 看起来像这样 -

<CATALOG>
    <CATALOG-NAME>C1</CATALOG-NAME>
    <CD>
        <CD-NAME>Empire Burlesque</CD-NAME>
        <ARTIST>Bob Dylan</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>Columbia</COMPANY>
        <PRICE>10.90</PRICE>
        <YEAR>1985</YEAR>
    </CD>
    <CD>
        <CD-NAME>Hide your heart</CD-NAME>
        <ARTIST>Bonnie Tyler</ARTIST>
        <COUNTRY>UK</COUNTRY>
        <COMPANY>CBS Records</COMPANY>
        <PRICE>9.90</PRICE>
        <YEAR>1988</YEAR>
    </CD>
</CATALOG>

我一直在尝试使用XSLT,但是我没有找到任何可以更改标签值的函数。我上面发布的示例类似于我需要处理较大XML文件时要执行的操作,其中我将替换标签。 - Srinivas
1个回答

48

对于想要重命名的元素,使用带有覆盖的标识转换:

<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="CD/NAME">
        <CD-NAME><xsl:apply-templates select="@*|node()" /></CD-NAME>
    </xsl:template>
    <xsl:template match="CATALOG/NAME">
        <CATALOG-NAME><xsl:apply-templates select="@*|node()" /></CATALOG-NAME>
    </xsl:template>
</xsl:stylesheet>

你能否请包含一行描述此代码如何工作的说明?谢谢! - Akhoy
身份转换产生与其输入相同的输出。在这种情况下,我们稍微修改身份转换以匹配CD/NAMECATALOG/NAME元素,并为这些特定标签名称生成重命名的输出。其他所有内容保持不变。这是一种常见模式。 - Wayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接