我正在使用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>
我在步骤中添加的配置如下:
我得到的结果如下:
如果我更改内容中的'循环X路径',如:/bookstore/book/price
,我得到了相同的第一个价格(29.99)的4行。
答案 0 :(得分:1)
In&#34; Content&#34;你设置&#34;循环XPath&#34;到modlog_enabled
,所以你最终会得到一个循环(在这个例子中)两个项目 - 你想要的那个,另一个。
In&#34; Fields&#34;您通常会设置要从每个项目中提取的数据字段。因此XPath应该是相对的。
但你使用了/bookstore/book
,这是一条绝对路径。它选择了三个项目,其中Pentaho只能用第一个项目来填充一个字段。这就是你两次获得//book[@name = '1.1']/price
的原因。
怎么办?它始终采用相同的方法。
获取所有书籍的一般信息:
29.99
//book
,可能还有./price[1]
获取一本特定书籍的一般信息:
./title
//book[@name = '1.1']
,可能还有./price[1]
获取一本特定书籍的价格:
./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']
并让所有孩子都拥有各自的节点?
由于