php - 如何将带有命名空间的标签更改为默认命名空间中带有前缀的标签
问题描述
我需要通过用下划线替换命名空间冒号来修改一些 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>
请注意,日期中的冒号没有改变。我正在尝试创建一个正则表达式,它将抓住“<”和“>”之间的任何冒号并将其替换为“_”,但我是一个正则表达式菜鸟,所以它被证明是不可能的 :^)
解决方案
如果您想避免意外结果,当您必须处理 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);
推荐阅读
- ios - 如何在 iOS 设备上以编程方式快速显示 UIImageView 后面的彩色磁盘
- python - 为什么 Flask 2.0.x Blueprint errorhandler 现在会导致 mypy 类型错误?
- python - 如何同时运行相同的异步函数多次?
- deep-learning - 高纵横比物体的物体检测
- java - 错误 HTTP 500 实例化 servlet 类时出错
- jupyter-notebook - Anaconda + Jupyter Notebook 似乎表现出 Python 2 的行为,即使系统说它的 Python 3
- django - Django ORM 将日期转换为日期时间,这会降低查询速度 30 倍
- java - 在 ical4j 中没有收到邀请接受电子邮件
- c++ - C++:+ 或 - 可以告诉编译器一个值应该是一个 int 吗?
- java - JDA 获取所有渠道