首页 > 解决方案 > 如何将带有命名空间的标签更改为默认命名空间中带有前缀的标签

问题描述

我需要通过用下划线替换命名空间冒号来修改一些 XML 标记,因此:

<video:rating>5</video:rating>
<video:view_count>128</video:view_count>
<video:publication_date>2017-02-25T00:25:44+00:00</video:publication_date>

会变成这样:

<video_rating>5</video_rating>
<video_view_count>128</video_view_count>
<video_publication_date>2017-02-25T00:25:44+00:00</video_publication_date>

请注意,日期中的冒号没有改变。我正在尝试创建一个正则表达式,它将抓住“<”和“>”之间的任何冒号并将其替换为“_”,但我是一个正则表达式菜鸟,所以它被证明是不可能的 :^)

标签: phpregexxml

解决方案


如果您想避免意外结果,当您必须处理 XML 时,最好始终使用为 XML 设计的工具。

假设您有一个像这样的站点地图文件:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
  <url>
     <loc>http://example.com/video-page.html</loc>
     <video:video>            
        <video:thumbnail_loc>http://example.com/thumb1.jpg</video:thumbnail_loc>
        <video:title>Clown in the garden</video:title>
        <video:description>Crazy clown is riding a rabbit.</video:description>    
        <video:content_loc>http://www.example.com/video1.mp4</video:content_loc>
     </video:video>
  </url>
</urlset>

要将具有命名空间“video”的元素更改为默认命名空间中本地名称以“video_”开头的元素,您可以使用 XSLT(可扩展样式表语言转换)定义模板,您可以在其中编辑 xml 文档的元素。这些样式表使用 xpath 语言来精确定位您想要的元素。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
    <xsl:output indent="yes" encoding="UTF-8"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="video:*">
        <xsl:element name="{concat('video_', local-name(.))}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

请注意,您需要两个模板:第一个(通常称为身份模板)复制您的所有文档,第二个仅处理来自“视频”命名空间的标签。

然后,您在 PHP 代码中所要做的就是将 XSLT 应用于您的 XML 文档:

$xmldoc = new DOMDocument;
$xmldoc->load($sitemapFile);

$xsldoc = new DOMDocument;
$xsldoc->load($stylesheetFile);

$xsl = new XSLTProcessor();
$xsl->importStyleSheet($xsldoc);
echo $xsl->transformToXML($xmldoc);

推荐阅读