使用XSLT小写RSS XML中的所有标记名称和属性

时间:2016-12-05 22:17:47

标签: xml xslt rss xslt-1.0

我怎样才能打开下面的内容(大写字母标签,即<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. 的示例属性
  3. 我将使用PHP来运行此
  4. 请注意xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"标记内<rss>的第一行命名空间设置 - 必须保留
  5. 请注意iTunes名称空间项目,例如<itunes:name>OWNER NAME</itunes:name> - 这些项目必须保持完全相同

1 个答案:

答案 0 :(得分:2)

这在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>