我正在使用Web-Harvest来做一些网页“刮”。我有一个值得组织的表格。桌子很简单。但是,我需要使用表的列标题来确定每列的数据类型。表格看起来像这样....
<table>
<tr class="header">
<td>Name</td>
<td>Age</td>
<td>Gender</td>
</tr>
<tr>
<td>Bill</td>
<td>25</td>
<td>M</td>
</tr>
<tr>
<td>Emily</td>
<td>31</td>
<td>F</td>
</tr>
</table>
我正在使用XQuery,如Web-Harvest示例所示,我知道如何通过索引获取值并使用属性(类,id等),但在这种情况下,我不确定如何确定第1列是名称,第2列是年龄等...我想以这种形式输出XML ...
<person>
<name>Bill</name>
<age>25</age>
<gender>M</gender>
</person>
<person>
<name>Emily</name>
<age>31</age>
<gender>F</gender>
</person>
我在另一篇文章中看到了这段代码片段,但我不确定它是如何工作的。
//tr[td[.="Jim"]]/td[count(ancestor::table/thead/tr/th[.="Credit"]/preceding-sibling::*)+1]
看起来每个行都引用了祖先(parent?)来查找相应的列标题。除此之外,我迷路了。任何其他信息都会非常有用。
提前致谢。
答案 0 :(得分:1)
此XQuery表达式:
<persons>
{
let $names := /*/tr[1]/td
return
for $tr in /*/tr[position() ge 2]
return
<person>
{ for $i in 1 to count($tr/td)
return
element {$names[$i]} {$tr/td[$i]}
}
</person>
}
</persons>
应用于提供的XML文档:
<table>
<tr class="header">
<td>Name</td>
<td>Age</td>
<td>Gender</td>
</tr>
<tr>
<td>Bill</td>
<td>25</td>
<td>M</td>
</tr>
<tr>
<td>Emily</td>
<td>31</td>
<td>F</td>
</tr>
</table>
生成想要的正确结果:
<persons>
<person>
<Name>
<td>Bill</td>
</Name>
<Age>
<td>25</td>
</Age>
<Gender>
<td>M</td>
</Gender>
</person>
<person>
<Name>
<td>Emily</td>
</Name>
<Age>
<td>31</td>
</Age>
<Gender>
<td>F</td>
</Gender>
</person>
</persons>