使用 xpath 选择第一个结果的子项

2023-12-08

我有一段 XML,其中相同的信息可以显示为不同节点的子节点。例如 :

<root>
<category id=1>
        <product id="ABC123" >

              <sizes>
                    <size name="S"/>
                <size name="M"/>
                <size name="L"/>
                <size name="XL"/>
                <size name="2XL"/>
                <size name="3XL"/>
              </sizes>
            </product>

                 </products>
           </category>
<category id=2>
        <products>
        <product id="ABC123" >

              <sizes>
                    <size name="S"/>
                <size name="M"/>
                <size name="L"/>
                <size name="XL"/>
                <size name="2XL"/>
                <size name="3XL"/>
              </sizes>
            </product>

          <product id="PPP543" >

              <sizes>
                    <size name="S"/>
                <size name="M"/>
                <size name="L"/>
                <size name="XL"/>
              </sizes>
            </product>

                 </products>
           </category>

我的目标是选择产品 id ABC123 的大小并将它们存储为数组。我当前的代码是:

$arrTest=array();


    foreach($xml->xpath('//root/category/products/product[@id= "'.$productCall.'" ]/sizes/size') as $size){

              array_push($arrTest, $size["name"]);
      }

$productCall 是我正在寻找的 id。在本例中为 ABC123。

输出为S、M、L、XL、2XL、3XL、S、M、L、XL、2XL、3XL。这意味着它正在读取找到的两个条目。考虑到 foreach 循环,我预计会出现这种情况,但我似乎找不到一种方法来获取第一个结果的输出。我尝试添加 [0] 和 [1] :

$y=$xml->xpath('//root/category/products/product[@id= "'.$productCall.'" ][1]/sizes/size');

[0] 不返回任何内容,[1] 返回与我已经得到的结果相同的结果。

我希望这是一个简单的问题,我错过了一些基本的东西或者只是想太多,因为我以前确实没有使用过 xpath。


Use:

(/*/*//product[@id='ABC123']/sizes)[1]/size

Or use:

((/*/*/product | /*/*/products/product)/sizes)[1]/size

基于XSLT的验证:

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

 <xsl:template match="/">
  <xsl:copy-of select=
    "(/*/*//product[@id='ABC123']/sizes)[1]/size"/>
========
  <xsl:copy-of select=
    "((/*/*/product | /*/*/products/product)/sizes)[1]/size"/>

 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时(将其纠正为格式良好后):

<root>
    <category id="1">
        <product id="ABC123" >
            <sizes>
                <size name="S"/>
                <size name="M"/>
                <size name="L"/>
                <size name="XL"/>
                <size name="2XL"/>
                <size name="3XL"/>
            </sizes>
        </product>
    </category>
    <category id="2">
        <products>
            <product id="ABC123" >
                <sizes>
                    <size name="S"/>
                    <size name="M"/>
                    <size name="L"/>
                    <size name="XL"/>
                    <size name="2XL"/>
                    <size name="3XL"/>
                </sizes>
            </product>
            <product id="PPP543" >
                <sizes>
                    <size name="S"/>
                    <size name="M"/>
                    <size name="L"/>
                    <size name="XL"/>
                </sizes>
            </product>
        </products>
    </category>
</root>

对两个 XPath 表达式进行求值,并将每个表达式中选定的节点(在视觉上很好地分隔)复制到输出中 — 两者都是正确的:

<size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
<size name="2XL"/>
<size name="3XL"/>
========
  <size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
<size name="2XL"/>
<size name="3XL"/>

Do note:我希望第二个 XPath 表达式更有效(在足够大的文档上),因为它不使用//伪运算符。

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

使用 xpath 选择第一个结果的子项 的相关文章

随机推荐

  • PHP strtotime 错误(有时)?

    我在我的 PHP 代码中遇到了 strtotime 的问题 有时它是错误的 仅对于某些时区 而对于其他时区来说它是正确的 我无法理解它 我已经设置了也在我的页面顶部 但这没有帮助 基本上它的作用是添加或减去offset 3600值到设定时间
  • 迭代多个查询并将其存储在 pyspark dataframe 中

    我在 hive 中有一个表 我想根据循环中的条件查询它 并将结果动态存储在多个 pyspark 数据帧中 基本查询 g1 select from db hive table where group 1 group 1 spk sql g1
  • Javascript 如何匹配回调函数中的参数?

    我刚开始学习JavaScript 回调函数似乎很难理解 我的一个问题是javascript如何匹配回调函数中的参数 例如在以下 forEach 循环中 var friends Mike Stacy Andy Rick friends for
  • 如何迭代两个列表?

    我正在尝试在 pyGTk 中做一些事情 我构建了一个 HBox 列表 self keyvalueboxes for keyval in range 1 self keyvaluelen self keyvalueboxes append g
  • Angular.js:如何为所有应用程序控制器调用一次服务

    我不知道这是否是 Angular 概念之一或可能做到的 但我有一项调用用户信息 姓名 id 年龄 的服务 factory me function resource API URL q return getUser function var
  • Java Swing:多个窗口[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我是 GUI 编程新手 但需要创建一个多窗口 GUI 有谁知道有什么好的在线教程吗 或者您能否展示一个可以启动 2 个窗口的简单代码 只需创建两个
  • 如何在 O(n) 或 O(nlogn) 中找到包含重复项的最长非递减子序列?

    我们知道有一种算法可以在 O nlogn 中找到最长递增子序列 我想知道我们是否能找到时间复杂度相似的最长非递减子序列 例如 考虑一个数组 4 10 4 8 9 最长的递增子序列是 4 8 9 最长的非递减子序列是 4 4 8 9 首先 这
  • GUI 以 30 fps 运行?

    在测试一些使用 Swingworker 的实时模拟代码时 我注意到我的 GUI 似乎总是以 30 fps 运行 不多也不少 每次用户与应用程序交互 如鼠标移动 或调用 Swingworker 的 process 方法时 我都会更新 GUI
  • 如何从 C++ 将字符串矩阵传递到 Cuda 内核

    Problem 我有一个 C 矩阵 里面充满了字符串 我想将它传递给 cuda 内核函数 我知道 CUDA 无法处理字符串 因此经过一些研究 我尝试了下面列出的一些解决方案 尝试 在 C 中定义一个指针数组 其中每个单元格包含一个指针字符
  • JavaScript:将 ex 转换为 px

    所以我正在阅读 elem style width 并得到类似 3 1415926ex 的内容 我想将其转换为 px JavaScript 是否有内置函数来执行此操作 我更喜欢砍掉字符串的最后 2 个字母 将其读取为数字 然后将其乘以一个魔法
  • Qt3d:应用 Qt3DRender::QLayerFilter 时显示的工件

    我正在尝试使用图层过滤 如图所示这个答案 为此 我编写了一个简单的测试 见下文 这是question 在红色球体的某个位置 会出现伪影 看起来像是另一个摄像机在坐标 0 0 0 0 0 0 中的显示 See screen 在我的示例中 可以
  • 防止文本框在更新时返回到文本框的开头

    有没有办法让文本框在更新时冻结其位置 我每 1 秒更新一次 TKinter 中的文本框 但显示一些不断变化的信息 但是 我不希望文本框在更新时返回到文本框的开头 每次更新后 我都被迫快速向下滚动文本框以查看某些数据的更改 Defined a
  • Tailwind的config中,添加属性到主题VS theme.extend有什么区别?

    Tailwind 的配置文档多次使用了extend属性 但没有阐明在其上进行自定义的区别theme财产VStheme extend财产 module exports content src html js theme colors blue
  • 使用不同参数 testng 顺序执行多个测试

    我试图使用数据提供程序按顺序运行具有不同参数的多个测试 基本上场景是假设有 5 个测试完成测试流程 并且所有测试用例都应按顺序运行假设在数据提供程序中返回的第一个参数是 air 然后所有 5 个测试应该使用参数 air 运行 然后是第二个参
  • 在OpenGL中绘制多个三角形

    我刚刚开始使用 OpenGL 并且已经制作了自己的用 C 绘制三角形的 OOP 版本 我正在使用 glfw 和 glew 如果这很重要的话 我不明白为什么我不能画超过 1 个三角形 这是主要功能 int main Graphics Wind
  • 打开 Bootstrap Modal 以在 Ruby on Rails 中编辑记录

    我有一个 用户 模型 我在用户索引页面上有一个用户列表 每个用户旁边都有一个编辑按钮 我想单击每个用户的编辑按钮 这将打开引导模式 在引导模式上 我想显示可以编辑的用户记录 编辑表单将来自 form html erb 部分 它将用于新的和编
  • Facebook Messenger 的自定义 URI 方案

    鉴于近期 鼓励 由 Facebook 迁移到单独的即时通讯应用程序 并作为 信息非常丰富 回答有关 Facebook 应用程序支持的 URL URI 方案的问题 我一直想知道有关 Facebook Messenger 应用程序的信息是否自定
  • 有没有办法将寄存器文件视为 ARMv8 中的数组(标量或 Neon)?

    假设我有一个短数组v说 8int64 t 我有一个算法需要访问该数组的不同元素 这些元素不是编译时常量 例如就像是v i j 2 其中i and j是不受任何类型的常量传播影响的变量 通常 我会保留内存中的数组 计算数组索引 从内存中的该位
  • 快线申报

    我有 2 条路线 例如 router get project id req res gt console log 1 router get project active req res gt console log 2 每当我调用 proj
  • 使用 xpath 选择第一个结果的子项

    我有一段 XML 其中相同的信息可以显示为不同节点的子节点 例如