如何一次处理多个 xpath(基于提要结构)或使用相同的结构创建我自己的提要

2023-12-26

下面的代码经过测试并且可以工作,它打印具有此结构的提要的内容。

<rss>
    <channel>
        <item>
            <pubDate/>
            <title/>
            <description/>
            <link/>
            <author/>
        </item>
    </channel>
</rss>

我没有成功做到的是打印遵循下面这个结构的提要(区别在于<feed><entry><published>)即使我将 xpath 更改为/feed//entry。 您可以在页面源代码中看到结构。

<feed>
    <entry>
        <published/>
        <title/>
        <description/>
        <link/>
        <author/>
    </entry>
</feed>

不得不说代码排序全部item基于其pubDate。在第二个结构提要中,我想它应该对所有内容进行排序entry基于其published.

我可能在找不到的 xPath 上犯了一个错误。但是,如果最后我设法正确打印该提要,我如何修改代码以同时处理不同的结构?

是否有任何服务允许我根据这些提要创建和托管自己的提要,以便我对所有人都具有相同的结构?我希望我已经表达清楚了……谢谢。

<?php

$feeds = array();

// Get all feed entries
$entries = array();
foreach ($feeds as $feed) {
    $xml = simplexml_load_file($feed);
    $entries = array_merge($entries, $xml->xpath(''));
}

?>

这个答案的主要贡献是一个可以与无限多种格式一起使用的解决方案(最后),只需在外部(全局)参数中指定所有“条目”替代名称$postElements以及外部(全局)参数中的所有“发布日期”替代名称$pub-dateElements.

除此之外,这里是如何指定选择所有的 XPath 表达式/rss//item和所有/feed//entry元素。

在只有两种可能的文档格式的简单情况下这个(由 @Josh Davis 提议)Xpath 表达式可以正确工作:

/rss//item  |   /feed//entry

更通用的 XPath 表达式允许从一组无限数量的文档格式中选择所需的元素:

/*[contains($topElements, concat('|',name(),'|'))]
    //*[contains($postElements, concat('|',name(),'|'))]

其中变量$topElements应替换为顶部元素的所有可能名称的管道分隔字符串,并且$postElements应替换为“entry”元素的所有可能名称的管道分隔字符串。我们还允许“entry”元素在不同的文档格式中处于不同的深度。

特别是,对于这个具体情况,XPath 表达式将是:

/*[contains('|feed|rss|', concat('|',name(),'|'))]
    //*[contains('|item|entry|', concat('|',name(),'|'))]

本文的其余部分展示了如何完全在 XSLT 中完成所需的完整处理——轻松而优雅。


I. A gentle介绍

使用 XSLT 进行此类处理既轻松又简单:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <myFeed>
   <xsl:apply-templates/>
  </myFeed>
 </xsl:template>

 <xsl:template match="channel|feed">
  <xsl:apply-templates select="*">
   <xsl:sort select="pubDate|published" order="descending"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="item|entry">
  <post>
    <xsl:apply-templates mode="identity"/>
  </post>
 </xsl:template>

 <xsl:template match="pubDate|published" mode="identity">
  <publicationDate>
   <xsl:apply-templates/>
  </publicationDate>
 </xsl:template>

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

当此转换应用于此 XML 文档时(格式1):

<rss>
    <channel>
        <item>
            <pubDate>2011-06-05</pubDate>
            <title>Title1</title>
            <description>Description1</description>
            <link>Link1</link>
            <author>Author1</author>
        </item>
        <item>
            <pubDate>2011-06-06</pubDate>
            <title>Title2</title>
            <description>Description2</description>
            <link>Link2</link>
            <author>Author2</author>
        </item>
        <item>
            <pubDate>2011-06-07</pubDate>
            <title>Title3</title>
            <description>Description3</description>
            <link>Link3</link>
            <author>Author3</author>
        </item>
    </channel>
</rss>

当它应用于此等效文件时(格式2):

<feed>
        <entry>
            <published>2011-06-05</published>
            <title>Title1</title>
            <description>Description1</description>
            <link>Link1</link>
            <author>Author1</author>
        </entry>
        <entry>
            <published>2011-06-06</published>
            <title>Title2</title>
            <description>Description2</description>
            <link>Link2</link>
            <author>Author2</author>
        </entry>
        <entry>
            <published>2011-06-07</published>
            <title>Title3</title>
            <description>Description3</description>
            <link>Link3</link>
            <author>Author3</author>
        </entry>
</feed>

在这两种情况下,都会产生相同的想要的正确结果:

<myFeed>
   <post>
      <publicationDate>2011-06-07</publicationDate>
      <title>Title3</title>
      <description>Description3</description>
      <link>Link3</link>
      <author>Author3</author>
   </post>
   <post>
      <publicationDate>2011-06-06</publicationDate>
      <title>Title2</title>
      <description>Description2</description>
      <link>Link2</link>
      <author>Author2</author>
   </post>
   <post>
      <publicationDate>2011-06-05</publicationDate>
      <title>Title1</title>
      <description>Description1</description>
      <link>Link1</link>
      <author>Author1</author>
   </post>
</myFeed>

二.完整的解决方案

这可以推广到参数化解决方案:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="postElements" select=
 "'|entry|item|'"/>
 <xsl:param name="pub-dateElements" select=
  "'|published|pubDate|'"/>

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

 <xsl:template match="/">
  <myFeed>
   <xsl:apply-templates select=
   "//*[contains($postElements, concat('|',name(),'|'))]">
    <xsl:sort order="descending" select=
     "*[contains($pub-dateElements, concat('|',name(),'|'))]"/>
   </xsl:apply-templates>
  </myFeed>
 </xsl:template>

 <xsl:template match="*">
  <xsl:choose>
   <xsl:when test=
    "contains($postElements, concat('|',name(),'|'))">
    <post>
      <xsl:apply-templates/>
    </post>
   </xsl:when>
   <xsl:when test=
   "contains($pub-dateElements, concat('|',name(),'|'))">
    <publicationDate>
     <xsl:apply-templates/>
    </publicationDate>
   </xsl:when>
   <xsl:otherwise>
    <xsl:call-template name="identity"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>

</xsl:stylesheet>

此转换可用于无限多种格式,只需在外部(全局)参数中指定所有“条目”替代名称$postElements以及外部(全局)参数中的所有“发布日期”替代名称$pub-dateElements.

任何人都可以尝试此转换,以验证当应用于上面的两个 XML 文档时,它是否再次产生相同的、所需的正确结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何一次处理多个 xpath(基于提要结构)或使用相同的结构创建我自己的提要 的相关文章

  • header() 错误未在 php 中显示

    我写了一个PHP程序 我用session start and header 函数 我知道在向客户端发送任何内容之前应该使用此函数 没关系 但是为了测试 我向客户端发送了一条测试消息echo test 在使用 header 之前 但我没有收到
  • 如何将自定义类型数组传递给 Postgres 函数

    我有一个自定义类型 CREATE TYPE mytype as id uuid amount numeric 13 4 我想将它传递给具有以下签名的函数 CREATE FUNCTION myschema myfunction id uuid
  • 在 Perl 中解析 RSS/Atom 的最佳库是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我注意到XML RSS 解析器 http search cpan org dist XML RSS P
  • 智能位置表单字段

    我的用户注册表单上有一个文本字段location 我本质上希望这个字段能够根据 Google 地图 或同等地图 进行验证 只允许有效位置通过 最好采用类似的格式滑铁卢 伦敦 or 伦敦 英国 要求 除了位置名称之外 我还想返回该位置中心的坐
  • 从twitter api实体参数php获取图像url

    我正在尝试通过实体参数使用 php 获取并显示在推文中发布的图像 我的 url 中有 include entities 可以看到返回的 json 中的实体 在我的 foreach 循环中 我正在执行以下操作 foreach results
  • Ubuntu 18.04升级后php7.2-curl无法安装

    今天从 16 04 升级到 18 04do release upgrade d 在升级过程中 我被告知一些软件包将被删除 其中包括 删除 libperl5 22 lxc common perl modules 5 22 php imagic
  • 使用 HTTP-Basic 身份验证发出 HTTP GET 请求

    我需要为我正在开发的 Flash Player 项目构建一个代理 我只需要使用 HTTP Basic 身份验证向另一个 URL 发出 HTTP GET 请求 并提供来自 PHP 的响应 就好像 PHP 文件是原始源一样 我怎样才能做到这一点
  • $_POST、$_GET 和 $_REQUEST 之间有什么区别?

    我对这些超级全局变量有点困惑 POST GET and REQUEST 在 PHP 中 在 PHP 中哪些场景需要使用这些变量 这三个变量的主要区别是什么 POST是在使用 application x www form urlencoded
  • TCPDF/PHP 和字体:大写数字(血统数字?旧样式?)

    我得到了一种特殊的字体 上面有这样的数字 例如 正如您在 3 上看到的 一些数字下降到基线以下 我想要实现的是 这些数字不会低于该线 并且看起来像这样 在 Word 中 可以在相同字体的字符设置中轻松设置 如何在 TCPDF 中呈现数字 我
  • Facebook 中用户的时区是如何编码的

    我需要检查用户的时区 但我找不到它的真正定义 参考API http developers facebook com docs reference api user says 用户的时区与 UTC 的偏移量 现在在维基百科上这些是可能的时区
  • Facebook Graph API v3.1 开发人员访问令牌权限限制

    如您所知 Facebook 将其 API 升级到了 V3 1 现在正在慢慢地淘汰旧的 API 和应用程序 因此我们必须迁移到新的 API 他们做出了一些艰难的决定 这对垃圾邮件网站来说是好事 但对开发人员来说也很难 提醒 Graph API
  • 通过 AJAX 发送 XML

    我在 jQuery 中创建了一个 xml 文档 如下所示 var xmlDocument
  • 如何在无法重启的服务器(Apache)上使用gettext?

    我在服务器故障上问了这个问题 https serverfault com questions 104224 how do you use gettext on server apache you cant restart但我没有得到任何回应
  • DOMPDF - 未找到“字体”类

    我正在尝试通过命令行添加字体 每次我尝试都会收到以下错误 Fatal error Class Font not found in home scripts public html MarketingPalv2 load font php o
  • 在 PHP 中将十进制/双精度/浮点值与 PDO 绑定的最佳方法是什么?

    看来类常量只涵盖PDO PARAM BOOL PDO PARAM INT and PDO PARAM STR用于绑定 您只是将十进制 浮点 双精度值绑定为字符串还是有更好的方法来处理它们 MySQLi 允许使用 d 类型表示 double
  • PHP 时间间隔

    我正在寻找一个看起来应该非常简单的解决方案 但似乎我不能在这里找到任何好的答案 而且我自己似乎无法让它发挥作用 我正在寻找的是设置开始时间 结束时间 然后迭代给定时间间隔之间的一组时间 例如 上午 9 00 下午 5 00 是开始时间 这些
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • 如何使用 PHP 从 MySQL 检索特定值?

    好吧 我已经厌倦了 过去一周我花了大部分空闲时间试图解决这个问题 我知道 SQL 中的查询已更改 但我无法弄清楚 我能找到的所有其他帖子似乎都已经过时了 如果有人能帮助我 我将非常感激 我想做的就是使用手动输入数据库的唯一 密码 来检索行的
  • 图像创建从jpeg() PHP

    我正在使用 imagecreatefromjpeg 函数合并两张图片 现在我面临的问题是 当我使用服务器中的图片时 它工作正常 而当我使用其他网站的图片时 它不起作用 例如 当我使用这个 PHP 文件时http coolfbapps in
  • 如何显示 PHP 对象

    我有这样的代码 dataRecord1 client gt GetRecord token table filter echo pre print r dataRecord1 echo pre foreach dataRecord1 gt

随机推荐

  • 如何将新的 json 字段添加到 groovy 中的现有 json

    我现有的 Json 看起来像 def json req date Tue 06 Oct 2015 09 10 52 GMT nonce 6cm7PmwDOKs devId
  • 如何让服务根据服务运行情况动态动作

    嗨 朋友们 我试图让我的服务动态运行 我已经为我的服务设置了大约 2 分钟的时间 如果假设它正在做大量的工作 意味着它将超过 2 分钟的时间限制 那么我们需要检查服务条件如果工作待处理意味着我们需要运行该实例直到完成 所以我在谷歌上尝试了下
  • 什么是 Mongoose 错误:对于路径“_id”处的值 XXX,转换为 ObjectId 失败?

    当发送请求至 customers 41224d776a326fb40f000001和一个文件 id 41224d776a326fb40f000001不存在 doc is null我正在返回一个404 Controller prototype
  • 单击闪亮应用程序中的网络节点后更新数据表

    我有一个简单的闪亮应用程序 它显示一个网络 在下表中您可以看到通过边和边的名称连接网络节点 我想更新数据表以在单击节点时仅显示选定的节点信息 例如 当我单击节点 articaine 时 表中将仅显示 articaine 连接 dataset
  • getenv 是否缓存结果?

    我有好几个电话要打给getenv在我的代码中 调用了很多次 所以我看到了优化的潜力 我的问题是 getenv以某种方式在内部缓存结果 或者它是否在每次调用时查询环境变量 我已经分析了代码 getenv不是瓶颈 但如果效率更高的话我还是想改变
  • 字典=哈希?

    字典基本上只是一个哈希表吗 还有福利 在 Ruby 代码 Hash new 0 中 末尾的 0 是做什么用的 表 字典和映射这三个词经常作为同义词使用 在数据结构的上下文中 哈希表 哈希映射是表 字典 映射的一种 The 0 是一个块 匿名
  • 如何在 UPS API 中指定货件是否为住宅货件?

    我在用着UPS api JSON 参考 ups com 开发工具包 1 我需要带有 住宅货运 的货运评级列表 2 我需要添加带有 居住地址 的货件 我是添加ResidentialAddressIndicator作为 1 英寸ShipTo地址
  • VBA Excel 类模块中的子属性

    我有一个名为 cTask 的模块 其中包含以下代码 Private pMile As String Public Property Get Mile As String Mile pMile End Property Public Prop
  • 通过电话号码获取当前时间

    我想编写一个 RoR 移动应用程序 它可以为我提供给定电话号码所在国家 地区的当前时间及其区号 有没有一个好的 api 可以做到这一点 这不是一个好主意 对于拥有多个不同时区和多个区号的国家 地区 您会采取什么措施 时区与区号不一定存在一对
  • 为什么实体不能具有具有一对一强制逆关系的唯一性约束?

    为什么实体不能具有具有一对一强制逆关系的唯一性约束 有两个实体 Person 属性 名称 关系 部门 一对一 非可选 部门 属性 标题 唯一约束 关系 人 对多 可选 模型无法在 iOS 9 XCode 7 0 1 中编译 并出现错误配置的
  • 端口自更新:“macPorts 来源:命令执行失败”

    我在尝试着selfupdate我的 Macports 但我收到以下消息 Error opt local bin port port selfupdate failed Error synchronizing MacPorts sources
  • Android意图街景不再工作

    我曾经从我的应用程序启动一个意图到地图来显示街景全景 自从几天以来 当我启动意图地图时 它说 此处不提供街景视图 我尝试运行一个新项目 其目的只是Google https developers google com maps documen
  • 如何获取类型的所有公共(获取和设置)字符串属性

    我正在尝试创建一个方法来遍历通用对象列表并替换它们的所有类型属性string这是null或空并更换 有什么好的方法可以做到这一点 我有这种 外壳 到目前为止 public static void ReplaceEmptyStrings
  • 停止 Django 将时间转换为 UTC

    时区让我发疯 每次我以为我已经弄清楚了 有人改变了时钟 我就会遇到十几个错误 我想我终于达到了存储正确值的地步 我的时代是timestamp with time zone在保存它们之前我不会删除时区 TIME ZONE Europe Lon
  • 我可以删除或移动文件夹 NuGetFallbackFolder 吗?

    我可以删除文件夹吗C Program Files dotnet sdk NuGetFallbackFolder 或者将其移动到其他文件夹 最好不要放在C盘 如果可以去除的话 怎么去除呢 直接删除文件夹吗 有任何副作用或损害吗 如果可以移动
  • 从未分配的内存中读取安全吗?

    从随机地址读取安全吗 我知道写作是未定义的行为 但是只阅读怎么样 嗯 在许多可视化调试器中 我可以看到任意地址的内存内容 这是怎么做到的 由于行为是不确定的 所以答案也是不确定的 或者至少是不稳定的 如果你幸运的话 随机地址是在内存范围内
  • 通过 Delphi 在网页上按下按钮 [重复]

    这个问题在这里已经有答案了 Ex1 WebBrowser OleObject Document GetElementByID ID HERE Click https stackoverflow com questions 10593494
  • 爪哇和谷歌地图

    是否可以在 Swing 或小程序中渲染谷歌地图 我知道我也可以使用美国宇航局世界风 http worldwind arc nasa gov 但对于一个简单的应用程序来说 这似乎太过分了 SwingX项目中有JXMapViewer组件 您可以
  • Web API 操作参数间歇性为空

    相关问题 Web API ApiController PUT 和 POST 方法间歇性接收空参数 https stackoverflow com questions 16091024 web api apicontroller put an
  • 如何一次处理多个 xpath(基于提要结构)或使用相同的结构创建我自己的提要

    下面的代码经过测试并且可以工作 它打印具有此结构的提要的内容