2010-05-08 53 views
6

我的HTML代碼:XPATH查詢:如何獲取兩個元素?

<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

東西線沿線的[位置()]可能是有用的 – 2010-05-08 10:35:54

+0

很好的問題(+1) 。請參閱我的答案,以更正您的XML並討論兩個正確的解決方案,以及爲什麼第三個建議的XPath表達式是錯誤的。 – 2010-05-08 15:02:15

回答

6

我想你可能會尋找是沿着

[position() > 2] 

以檢索前兩個之後的所有元素線的東西。

+0

完美!謝謝。 我用什麼呢? [position()= 1] [position()= 4] 如果我只想得到第一個和第四個元素? – Damiano 2010-05-08 10:43:23

+2

@Damiano - 如果單獨評估這兩個謂詞的過濾器,你會得到你想要的信息。如果要在一個XPath表達式來評估它們,則需要將它們在一個單一的過濾器謂詞結合和使用'或'操作符:'[位置()= 1或位置()= 4]'否則,它將評估以查看兩個謂詞過濾器是否都是真實的(並且沒有元素將是第一個和第四個)。 – 2010-05-08 14:14:50

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

這指定的/*/*/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>