Pentaho - XPath选择具有特定父级的所有孩子

时间:2018-04-30 12:43:13

标签: xml xpath pentaho kettle

我正在使用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>

我在步骤中添加的配置如下:

Configuration Step Content

Configuration Step Fields

我得到的结果如下:

Result

如果我更改内容中的'循环X路径',如:/bookstore/book/price,我得到了相同的第一个价格(29.99)的4行。

3 个答案:

答案 0 :(得分:1)

In&#34; Content&#34;你设置&#34;循环XPath&#34;到modlog_enabled,所以你最终会得到一个循环(在这个例子中)两个项目 - 你想要的那个,另一个。

In&#34; Fields&#34;您通常会设置要从每个项目中提取的数据字段。因此XPath应该是相对的。

但你使用了/bookstore/book,这是一条绝对路径。它选择了三个项目,其中Pentaho只能用第一个项目来填充一个字段。这就是你两次获得//book[@name = '1.1']/price的原因。

怎么办?它始终采用相同的方法。

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

  • 在&#34;循环&#34;中选择正确的项目。部分:29.99
  • 使用相对路径选择字段值://book,可能还有./price[1]

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

  • 在&#34;循环&#34;中选择正确的项目。部分:./title
  • 使用相对路径选择字段值://book[@name = '1.1'],可能还有./price[1]

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

  • 在&#34;循环&#34;中选择正确的项目。部分:./title
  • 使用相对路径选择字段值://book[@name = '1.1']/price(或简称./text()

答案 1 :(得分:0)

尝试/bookstore/book[@name='1.1']/*

答案 2 :(得分:0)

谢谢Tomalak!它的工作。我试图放/bookstore/book[@name='1.1']/* Wasmachien,但在pentaho没有工作,但谢谢你的回答!

关键是, &#34; In&#34; Fields&#34;您通常会设置要从每个项目中提取的数据字段。因此,XPath应该是相对的。&#34;

现在我尝试用//book[@name = '1.1']选择所有指定的子节点,但如果在父书中有&#39; price&#39;并且&#39;折扣&#39; 。在相对路径中尝试使用.price并不起作用,它只会再次返回第一个孩子。 是否可以使用//book[@name = '1.1']并让所有孩子都拥有各自的节点?

由于