2010-05-08 2 views
6

Мой HTML-код:XPATH Query: Как получить два элемента?

<table> 
<tr> 
<td class="data1"><p>1</td></td> 
<td class="data1"><p>2</td></td> 
<td class="data1"><p>3</td></td> 
<td class="data1"><p>4</td></td> 
</tr> 
<tr> 
<td class="data1"><p>5</td></td> 
<td class="data1"><p>6</td></td> 
<td class="data1"><p>7</td></td> 
<td class="data1"><p>8</td></td> 
</tr> 
</table> 

Мой запрос:

xpath='//tr//td[@class="data1"][4]/p' 

Результаты является:

<p>4</p> 
<p>8</p> 

Результаты является правильно! но, если я хочу, чтобы получить пример:

<p>3</p> <p>4</p> 

<p>7</p> <p>8</p> 

Так

[3]/р и [4]/р

Как получить эти два элемента, каждый <tr>?

Большое вам спасибо!

+0

что-то вдоль линий положение [()] может быть полезным –

+0

Хороший вопрос (+1) , См. Мой ответ, который исправляет ваш XML и обсуждает два правильных решения и почему третье предложение XPath не соответствует действительности. –

ответ

6

Я думаю, что вы могли бы искать что-то вдоль линий

[position() > 2] 

, которая извлекает все элементы после первых двух.

+0

Отлично! Спасибо. Могу ли я использовать? [position() = 1] [position() = 4] Если я хочу получить только первый и элемент fouth? – Damiano

+2

@ Damiano - Если вы оцениваете эти два фильтра предикатов отдельно, вы получите нужную вам информацию. Если вы хотите оценить их в одном выражении XPATH, вам нужно будет объединить их в одном предикатном фильтре и использовать оператор 'или':' [position() = 1 или position() = 4] 'В противном случае это будет оценивать, являются ли оба предикатных фильтра истинными (и ни один элемент не будет как первым, так и четвертым). –

4

Прежде всего обратите внимание, что предоставленный XML не является корректным!

Я предполагаю, что предназначен wellformed XML более или менее выглядит следующим образом:

<table> 
    <tr> 
     <td class="data1"><p>1</p></td> 
     <td class="data1"><p>2</p></td> 
     <td class="data1"><p>3</p></td> 
     <td class="data1"><p>4</p></td> 
    </tr> 
    <tr> 
     <td class="data1"><p>5</p></td> 
     <td class="data1"><p>6</p></td> 
     <td class="data1"><p>7</p></td> 
     <td class="data1"><p>8</p></td> 
    </tr> 
</table> 

Для этого XML-документа, здесь мои ответы.

Использование:

/*/*/td[position() = 3 or position() = 4]/p

Или, вы можете использовать оператор XPath накидной:

/*/*/td[3]/p | /*/*/td[4]/p

Следующая является неправильным:

/*/*/td[3] [4]/p

Это определяет выбор 4-го узла /*/*/td[3] и не отберет ничего, потому что /*/*/td[3] выбирает только два узла.

Наконец, здесь преобразование, которое при запуске демонстрирует результат всех выражений XPath выше:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select=" /*/*/td[position() = 3 or position() = 4]/p"/> 

    ---------------------- 

    <xsl:copy-of select=" /*/*/td[3]/p | /*/*/td[4]/p"/> 

    ---------------------- 

    <xsl:copy-of select=" /*/*/td[3][4]/p"/> 

</xsl:template> 
</xsl:stylesheet> 
Смежные вопросы