0

xpathを使用して分析しようとしている次のものがあります

<table>
 <tr>

  <td>Name</td>
  <td>Info</td>
  <td><a href = "file1">Download</a></td>

</tr>

<tr>
 <td>Name2</td>
 <td>Info</td>
 <td><a href = "file2">Download</a></td>

</tr>

....

<tr>
..
</tr>

</table>

ダウンロードリンクを取得するための次のxpathがあります

$xpath->query("//a[text()='Download']/@href");

私が理解しようとしているのは、各ダウンロードの名前を取得するために送信するクエリです。

このページにはdividマークアップはまったくなく、プレーンなテーブル、tr、tdタグだけがあります。

私は次のようなものを試しました

$xpath->query("//preceding-sibling::a[text()='Download']");

誰かがこれについて何か考えを持っていますか?

4

1 に答える 1

1

近い!

特定のコンテキスト ノード (ここではhref、ダウンロードの属性) が与えられた場合、そのコンテキスト ノードを含む の最年長の兄弟を見つけたいとしtdます。したがって、相対パスは最初に に昇順し、td次に最も古い兄弟を見つける必要があります。

parent::a/parent::td/preceding-sibling::td[last()]

pまたはもっと簡単に (そして と の間に のような要素やspan介入する要素がないと仮定せずtda):

ancestor::td[1]/preceding-sibling::td[last()]

一部のユーザーは、preceding-sibling軸上のノードの逆番号を混乱させるので、本当に必要なtdのは最小の包含の最初の子であると言った方が簡単に感じるかもしれませんtr:

ancestor::tr[1]/child::td[1]

すべてのダウンロード リンクそれらのテキスト ラベルを 1 回のパスで取得する必要がある場合、その方法は、XPath を使用しているコンテキストによって異なります。たとえば XSLT では、次のように記述できます。

<xsl:apply-templates select="//a[text()='Download']/@href"/>

次に、適切なテンプレートでラベルを取得します。

<xsl:template match="a/@href">
  <xsl:value-of select="string(ancestor::tr[1]/td[1])"/>
  : 
  <xsl:value-of select="."/>
</xsl:template> 

他のホスト言語でも、同様のことをしたくなるでしょう。重要な問題は、 の式に一致するノードを反復処理する必要があることです。href次に、これらのノードごとに、ドキュメント内を戻ってラベルを取得する必要があります。「最初の XPath 式の現在のノードに基づいて、この 2 番目の XPath 式を評価する」という言い方は、環境によって異なります。

于 2012-08-23T22:11:50.107 に答える