用于数值比较的xpath表达式

时间:2011-05-02 09:09:27

标签: xpath greasemonkey

我正在编写Greasemonkey脚本,因此无法更改源XHTML。

给出以下XHTML片段:

<td>
    <span class="entry">Gender, Age:</span> Female, 42<br>
    <span class="entry">Country, Town:</span> United Kingdom, London 
    <span class="small09"></span>
</td>

是否可以编写一个可以使用document.evaluate进行评估的表达式,这样我就可以选择年龄大于40的所有条目?我想要以下内容:

var matches = document.evaluate("//table[tbody/tr[2]/td[1][number(SOMEHOW 
  MATCH THE AGE PART) > 40]]", 
  document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, 
  null);

由于

3 个答案:

答案 0 :(得分:1)

使用

//table[tbody/tr[2]/td[1]
  [number(
    substring-after(normalize-space(span[1]/following-sibling::text()[1]),
                   ',')
          ) 
   > 
     40
    ] 
       ]

答案 1 :(得分:0)

如果您将年龄设置为属性,则可以访问该值。

这样的东西
<Person Gender="F" Age="42" />

答案 2 :(得分:0)

您不能在文字内容上使用条件,但您可以使用JavaScript过滤结果。

这样的事情应该有效:

var targetCells     = document.evaluate (
                        "//table/tbody/tr[2]/td[1]",
                        document,
                        null,
                        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
                        null
                    );

for (var J = targetCells.snapshotLength - 1;  J >= 0;  --J)
{
    var thisCell    = targetCells.snapshotItem (J);

    //--- Get the age.  Key off (fe)male, {age in decimal years}<br> in the text of the table cell
    var ageTxt      = thisCell.textContent.match (/male[, ]+(\d+)/i);

    if (ageTxt  &&  ageTxt.length > 1)
    {
        var age     = parseInt (ageTxt[1]);
        if (age > 40)
        {
            //-----------------------
            //--- DO YOUR STUFF HERE.
            //-----------------------
        }
    }
}