Как выбрать все строки, кроме одного в xpath? [Дубликат]

Чтобы расширить области триангуляции и суммы треугольников, они работают, если у вас есть выпуклый многоугольник ИЛИ вы случайно выбрали точку, которая не генерирует линии для каждой другой точки, пересекающей многоугольник.

. Для общего непересекающегося многоугольника вам нужно суммировать произведение произведения (опорная точка, точка a) (контрольная точка, точка b), где a и b являются «рядом» друг с другом.

Предполагая, что у вас есть список точек, которые определяют многоугольник в порядке (порядок, когда точки i и i + 1 образуют линию многоугольника):

Сумма (кросс-произведение ((точка 0, точка i), (точка 0, точка i + 1)) для i = 1 до n - 1.

Возьмите величину этого поперечного произведения и у вас есть площадь поверхности.

Это будет обрабатывать вогнутые многоугольники, не беспокоясь о выборе хорошей контрольной точки, любые три точки, которые генерируют треугольник, который не находится внутри многоугольника, будут иметь поперечное произведение, которое указывает в противоположном направлении любого треугольника, который находится внутри многоугольника , поэтому области правильно суммируются.

38
задан priyank 14 April 2010 в 01:25
поделиться

2 ответа

, если вы хотите игнорировать «первый» элемент только тогда:

//li[position()>1]
or
(//a)[position()>1] 

, если вы хотите только последнее (например, ваш пример):

//li[last()]
or
(//a)[last()]
76
ответ дан t00ny 19 August 2018 в 05:26
поделиться
  • 1
    Помните, что индексы в XPath основаны на 1, а не на 0. Таким образом, выражение a[position()>1] возвращает все a элементы, кроме первого. – Iain Samuel McLean Elder 14 April 2010 в 02:15
  • 2
    position () возвращает позицию элемента контекста. В предоставленном XPATH позиция каждого a будет равна 1 AND last () и возвращает каждый из элементов a, а не пропускает первый. – Mads Hansen 14 April 2010 в 02:36
  • 3
    Чтобы получить position(), чтобы оценить, как ожидалось, вам нужно обернуть выбор элементов в круглых скобках, чтобы сгруппировать их в наборе узлов, а then применить фильтр предикатов в позиции (т.е. (//a)[position()>1] ] и (//a)[last()]) – Mads Hansen 14 April 2010 в 02:48
  • 4
    @isme ... да, я знаю, что это основано на 1, но я был озадачен вопросом, потому что он говорит, что хочет игнорировать первый элемент, но пример предполагает, что он хотел бы только последний – t00ny 14 April 2010 в 03:39
  • 5
    -1 Этот ответ неверен в контексте вопроса. В примере нет //a[position()>1], а //a[last()] имеет три совпадения. Вы тестировали свой XPath, прежде чем публиковать его? – Tomalak 14 April 2010 в 10:05

Вы можете использовать position(), чтобы пропустить «первый», но в зависимости от того, какой элемент вам интересен и каков контекст, вам может потребоваться небольшое изменение в вашем XPATH.

Например, если вы хотите обратиться ко всем элементам li и получить все, кроме первого, вы можете использовать:

//li[position()>1]

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

Однако, если вы хотите обратиться ко всем элементам a, вам нужно немного изменить XPATH. В контексте выражения //a[position()>1] каждый из элементов a будет иметь position() из 1 и last() будет оценивать значение true. Таким образом, он всегда будет возвращать каждый a и не будет пропускать первый.

Вам нужно обернуть выражение, которое выбирает a в скобках, чтобы сгруппировать их в наборе узлов, затем применяйте фильтр предикатов в позиции.

(//a)[position()>1]

В качестве альтернативы вы также можете использовать следующее выражение:

//a[preceding::a]

Это найдет все a, за исключением первого (поскольку нет a, предшествующего первому).

10
ответ дан Mads Hansen 19 August 2018 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: