如何使用Nokogiri获得每列的最大长度?
示例HTML:
<table>
<tr>
<td>ONE</td><td>TWO</td><td>THREE</td>
</tr>
<tr>
<td>Monaco</td><td>Bangkok</td><td>Thailand</td>
</tr>
</table>
结果是每个<td>
内的字符串长度。
<td>one</td> => 3
<td>two</td> => 3
<td>three</td> => 5
....
答案 0 :(得分:2)
首先,你要映射tr / td的长度:
lengths = doc.search('tr').map{|tr| tr.search('td').map{|td| td.text.length}}
=> [[3, 3, 5], [6, 7, 8]]
转置它以获取列并从每个列获得最大值:
lengths.transpose.map &:max
=> [6, 7, 8]
答案 1 :(得分:0)
纯粹的单行XPath 2.0解决方案,假设该表具有常规结构(每行具有相同的列数):
for $i in 1 to count(/*/tr[1]/td)
return
max(/*/tr/td[$i]/string-length())
基于XSLT 2.0的验证:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:sequence select=
"for $i in 1 to count(/*/tr[1]/td)
return
max(/*/tr/td[$i]/string-length())
"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<table>
<tr>
<td>ONE</td>
<td>TWO</td>
<td>THREE</td>
</tr>
<tr>
<td>Monaco</td>
<td>Bangkok</td>
<td>Thailand</td>
</tr>
</table>
评估XPath表达式并将此评估结果复制到输出中:
6 7 8