XPATH查询:如何获得两个元素?

时间:2010-05-08 10:32:49

标签: 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>

非常感谢你!

2 个答案:

答案 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>