我的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>
?
非常感谢你!
答案 0 :(得分:6)
我认为你可能正在寻找的东西是
[position() > 2]
检索前两个之后的所有元素。
答案 1 :(得分:4)
首先注意提供的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
这指定选择/*/*/td[3]
的第4个节点,将不选择,因为/*/*/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>