1

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

2 回答 2

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]
于 2012-09-17T08:05:27.630 回答
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
于 2012-09-17T12:41:57.043 回答