1

xpath 式を使用して、DOM ツリー内の特定の div クラスを決定しています (VolkerK のおかげです!)。

foreach($xpath->query('//div[@class="posts" and div[@class="foo"]]') as $node)
    $html['content'] = $node->textContent;
    //$html['node-position'] = $node->position(); // (global) index position of the child 'foo'
}

最終的には、子 'foo' が持つ (グローバル) インデックス位置を知る必要があります。これは、後で jQuery に置き換えたいためです: eq()または nth-child()。

それを行う方法はありますか?

正しい要素の選択に関する私の別の質問をフォローアップしています(クラス名による子のXPath/Domdocumentチェック)。

ありがとう!

アップデート:

私は以下を使用することを発見しました:

$html['node-position'] = $node->getNodePath() 

実際には、親ノードの xpath 構文 (/html/body/div[3]) のパスと要素番号が表示されますが、子 div 'foo' の場合はどうすればよいでしょうか?

4

2 に答える 2

4

特定の要素の「位置」を見つける XPath の方法x(位置は、XML ドキュメント内xのすべての要素のシーケンス (ドキュメント順) におけるその要素のインデックスを意味するように定義されています)次のとおりです。x

count(preceding::x) + count(ancestor-or-self::x)

この XPath 式が要素xを現在のノード (初期コンテキスト ノード) として評価されている場合、そのように定義された「位置」が生成されます。

XSLT ベースの検証:

次の XML ドキュメントを用意してみましょう。

<t>
    <d/>
    <emp/>
    <d>
        <emp/>
        <emp/>
        <emp/>
    </d>
    <d/>
</t>

この変換:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="v3rdEmp" select="/*/d/emp[2]"/>

 <xsl:template match="/">
  <xsl:value-of select=
   "count($v3rdEmp/preceding::emp)
   +
    count($v3rdEmp/ancestor-or-self::emp) "/>
 </xsl:template>
</xsl:stylesheet>

empドキュメントの 3 番目の要素を初期コンテキスト ノードとして使用して、上記の XPath 式を評価します。式のxは、必要な要素名 -- に置き換えられましたemp。次に、式の評価からの結果が出力されます。これが必要な正しい結果であることがわかります。

3
于 2012-02-27T18:05:15.427 に答える
0

Foreachは構文をサポートして$traversable as $key => $itemいるため、以下を使用する場合:

foreach($xpath->query('//div[@class="posts" and div[@class="foo"]]') as $key => $node)
    $html['content'] = $node->textContent;
    $html['node-position'] = $key;
}
于 2012-02-27T12:46:48.517 に答える