xpath выражение для числового сравнения - PullRequest
2 голосов
/ 02 мая 2011

Я пишу скрипт 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 ]

1 голос
/ 02 мая 2011

Используйте

//table[tbody/tr[2]/td[1]
  [number(
    substring-after(normalize-space(span[1]/following-sibling::text()[1]),
                   ',')
          ) 
   > 
     40
    ] 
       ]
0 голосов
/ 02 мая 2011

Вы не можете использовать условные выражения для текстового содержимого, но вы можете фильтровать результаты с помощью 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.
            //-----------------------
        }
    }
}
0 голосов
/ 02 мая 2011

Если вы установите возраст как атрибут, вы можете получить доступ к этому значению.

Что-то вроде

<Person Gender="F" Age="42" />
...