XPath与dittoed字段?

时间:2016-12-10 18:25:56

标签: xpath

在本文档中,如果第二列为空,则表示使用前一行的值。

<doc>
<table>
<tr><td>ASU</td><td>CS</td><td>3</td></tr>
<tr><td>ASU</td><td>English</td><td>3</td></tr>
<tr><td>ASU</td><td></td><td>4</td></tr>
<tr><td>ASU</td><td>French</td><td>3</td></tr>
</table>
<table>
<tr><td>CMU</td><td>CS</td><td>4</td></tr>
<tr><td>CMU</td><td>English</td><td>3</td></tr>
<tr><td>CMU</td><td>French</td><td>3</td></tr>
<tr><td>CMU</td><td></td><td>4</td></tr>
</table>
<table>
<tr><td>SDSU</td><td>English</td><td>3</td></tr>
<tr><td>SDSU</td><td></td><td>4</td></tr>
<tr><td>SDSU</td><td></td><td>5</td></tr>
<tr><td>SDSU</td><td>French</td><td>4</td></tr>
</table>
</doc>

我想第二列的行是English所以这些行就是行:

<tr><td>ASU</td><td>English</td><td>3</td></tr>
<tr><td>ASU</td><td></td><td>4</td></tr>
<tr><td>CMU</td><td>English</td><td>3</td></tr>
<tr><td>SDSU</td><td>English</td><td>3</td></tr>
<tr><td>SDSU</td><td></td><td>4</td></tr>
<tr><td>SDSU</td><td></td><td>5</td></tr>

XPath会是什么?

1 个答案:

答案 0 :(得分:2)

(这是使用XPath 1.0,可能有更好的解决方案与更新的XPath版本。)

首先,你想要tr,所以这很简单:

/doc/table/tr[...some predicate...]

您想要的行是:

  1. 第二个tr只包含“英语”的人

    tr[2] = 'English'
    
  2. 或第二个tr为空的那些......

    tr[2] = ''
    

    并且,查看以前的兄弟行没有空的tr ...

    preceding-sibling::tr[td[2] != '']
    

    第一个([1])有第二个tr,其中包含“英语”

    /td[2] = 'English'
    
  3. 因此,结合所有这些,为您提供所需行的查询是:

    /doc/table/tr[td[2] = 'English'
      or (td[2] = ''
        and preceding-sibling::tr[td[2] != ''][1]/td[2] = 'English')]