web-dev-qa-db-ja.com

PHP最後に一致した要素を選択するXPath

可能な重複:
PHP SimpleXML。最後のアイテムを取得する方法?
XSLT特定の部分文字列を含むすべてのノードを選択

「myClass」のクラスを持つ最後のスパン要素のコンテンツを見つける必要があります。いろいろな組み合わせを試しましたが、答えが見つかりません。

//span[@class='myPrice' and position()=last()]

これは、クラス「myClass」のすべての要素を返します。これは、見つかった各要素が処理時に最後であるためだと思いますが、実際に一致する最後の要素が必要です。

26
deab

処理したいプロセッサをマークする必要があります//span[@class='myPrice']を現在のセットとして使用し、述語position()= last()をそのセットに適用します。

(// span [@ class = 'myPrice'])[last()] 

例えば.

<?php
$doc = getDoc();
$xpath = new DOMXPath($doc);
foreach( $xpath->query("(//span[@class='myPrice'])[last()]") as $n ) {
  echo $n->nodeValue, "\n";
}


function getDoc() {
  $doc = new DOMDOcument;
  $doc->loadxml( <<< eox
<foo>
  <span class="myPrice">1</span>
  <span class="yourPrice">0</span>
  <bar>
    <span class="myPrice">4</span>
    <span class="yourPrice">99</span>
  </bar>
  <bar>
    <span class="myPrice">9</span>
  </bar>
</foo>
eox
  );
  return $doc;
}
49
VolkerK

使用した式は、「(a)_@class='myprice'_があり、かつ(b)親の最後の子である場合、すべてのスパン要素を選択することを意味します。2つのエラーがあります。

(1)すべてのスパン要素に適用するのではなく、@ classでフィルタリングした後、フィルター[position()=last()]を適用する必要があります

(2)//span[last()]という形式の式は、すべての要素の最後の子スパンを選択する/descendant-or-self::*/(child::span[last()])を意味します。優先順位を変更するには、括弧を使用する必要があります:_(//span)[last()]_。

したがって、式はVolkerKによって与えられる_(//span[@class='myPrice'])[last()]_になります。

7
Michael Kay