Запрос XPath: Как получить два элемента?

Мой HTML-код:

<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]/p и [4]/p

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

Огромное спасибо!

6
задан Damiano 8 May 2010 в 10:32
поделиться

2 ответа

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

Я предполагаю, что предполагаемый хорошо сформированный 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>
4
ответ дан 10 December 2019 в 00:35
поделиться

Я думаю, что вам нужно что-то вроде

[position() > 2]

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

6
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

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