如何使用Nokogiri获得每列的最大长度?

时间:2012-09-17 07:11:48

标签: ruby xpath nokogiri

如何使用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
....

2 个答案:

答案 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