Мой 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>
?
Огромное спасибо!
Прежде всего, обратите внимание на то, что предоставленный 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>
Я думаю, что вам нужно что-то вроде
[position() > 2]
которое извлекает все элементы после первых двух.