首页 > 解决方案 > Pentaho - XPath 选择具有特定父级的所有子级

问题描述

我正在使用 Pentaho '从 XML 获取数据'。

我想选择所有<price><book>名为'1.1'.

<bookstore>
  <book name = '1.1'>
    <title lang="en">Learning XML</title>
    <price>29.99</price>
    <price>39.99</price>
    <price>59.99</price>
  </book>

  <book name = '1.2'>
    <title lang="en">Harry Potter</title>
    <price>39.95</price>
  </book>
</bookstore>

我在步骤中放置的配置是这样的:

配置步骤内容

配置步骤字段

我得到的结果如下:

结果

如果我将 Content 中的“Loop Xpath”更改为:/bookstore/book/price我得到了 4 行相同的第一个价格 (29.99)。

标签: xmlxpathpentahokettle

解决方案


在“内容”中,您将“循环 XPath”设置为/bookstore/book,因此您将结束(在此示例中)两个项目的循环 - 您想要的一个,另一个。

在“字段”中,您通常设置要从每个项目中提取的数据字段。因此 XPath 在这里应该是相对的。

但是您使用//book[@name = '1.1']/price的是绝对路径。它选择了三个项目,其中 Pentaho 只能取第一个来填充字段。这就是为什么你得到29.99两次。

该怎么办?它总是相同的方法。

要获取所有书籍的一般信息:

  • 在“循环”部分选择正确的项目://book
  • 使用相对路径选择字段值:./price[1]并且可能./title

要获取一本特定书籍的一般信息:

  • 在“循环”部分选择正确的项目://book[@name = '1.1']
  • 使用相对路径选择字段值:./price[1]并且可能./title

要获取一本特定书籍的价格:

  • 在“循环”部分选择正确的项目://book[@name = '1.1']/price
  • 使用相对路径选择字段值:(./text()或简单地.

推荐阅读