使用 XSLT 将 RSS XML 内的所有标签名称和属性小写

Lowercase all tag names and attributes inside RSS XML using XSLT

我怎样才能把下面的(大写字母标签即<RSS>和大写字母属性即TYPE="audio/mpeg"

<RSS xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
    <CHANNEL>
        <title>Example Title</title>
        <LINK>Example Link</link>
        <atom:link HREF="http://example.com/feed" REL="self" TYPE="application/rss+xml"/>
        <itunes:subtitle>Example subtitle with itunes namespace</itunes:subtitle>
        <itunes:owner>
            <itunes:name>OWNER NAME</itunes:name>
            <itunes:email>owner@gmail.com</itunes:email>
        </itunes:owner>
        <ITEM>
            <TITLE>Title Name here</TITLE>
            <itunes:author>Author name here</itunes:author>
            <ENCLOSURE TYPE="audio/mpeg" URL="http://www.podtrac.com/abc.mp3" LENGTH="31805"/>
        </ITEM>
    </CHANNEL>
</RSS>

进入这个(小写字母标签即<rss>和小写字母属性即type="audio/mpeg"

<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
    <channel>
        <title>Example Title</title>
        <link>Example Link</link>
        <atom:link href="http://example.com/feed" rel="self" type="application/rss+xml"/>
        <itunes:subtitle>Example subtitle with itunes namespace</itunes:subtitle>
        <itunes:owner>
            <itunes:name>OWNER NAME</itunes:name>
            <itunes:email>owner@gmail.com</itunes:email>
        </itunes:owner>
        <item>
            <title>Title Name here</title>
            <itunes:author>Author name here</itunes:author>
            <enclosure TYPE="audio/mpeg" url="http://www.podtrac.com/abc.mp3" length="31805"/>
        </item>
    </channel>
</rss>

使用 XSLT?

备注:

  1. 需要是小写的所有标签和所有属性,而不仅仅是我的示例 <RSS><rss>TYPE="audio/mpeg"type="audio/mpeg"
  2. 我将使用 PHP 到 运行 这个
  3. 请注意 <rss> 标签内 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" 的第一行命名空间设置——这必须保持
  4. 请注意 iTunes 命名空间项目,例如 <itunes:name>OWNER NAME</itunes:name> - 这些必须保持完全相同

这在 XSLT-1.0 中给出了预期的结果:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
    <xsl:output indent="yes" />
    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

    <!-- lowercase'es all elements names and copies namespaces-->
    <xsl:template match="*">
        <xsl:variable name="rawName" select="substring-before(name(), ':')"/>
        <xsl:element name="{translate(name(), $uppercase, $smallcase)}" namespace="{namespace-uri()}">
            <xsl:copy-of select="namespace::*"/>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>

    <!-- lowercase'es all attribute names -->
    <xsl:template match="@*">
        <xsl:attribute name="{translate(name(), $uppercase, $smallcase)}">
          <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:template>

    <!-- copies the rest -->
    <xsl:template match="text() | comment() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>

</xsl:stylesheet>