Соответствующий атрибут XPath и содержимое элемента - PullRequest
0 голосов
/ 21 апреля 2010

Может кто-нибудь помочь со следующим вопросом XPath? Учитывая набор узлов:

<table> 
  <rows>
    <row>
      <value column="Product">Coal</value>
      <value column="Quantity">10000</value>
    </row>
    <row>
      <value column="Product">Iron</value>
      <value column="Quantity">5000</value>
    </row>
    <row>
      <value column="Product">Ore</value>
      <value column="Quantity">4000</value>
    </row>
  </rows>
</table>

Я хочу сделать запрос, чтобы найти подмножество узлов с заданным именем продукта. Обратите внимание, что имя продукта предоставляется атрибутом текущего обрабатываемого узла (т. Е. "@Name"). Поэтому, когда атрибут @name имеет значение «Уголь», я ожидаю, что это будет возвращено:

<row>
  <value column="Product">Coal</value>
  <value column="Quantity">10000</value>
</row>

Это то, что я придумал; Я знаю, что это неправильно, потому что я ничего не получаю.

$table/rows/row[value[@column='Product'][text()=@name]]

1 Ответ

2 голосов
/ 21 апреля 2010

Вам явно не хватает функции current()

$table/rows/row[value[@column='Product'] = current()/@name]

Внутри предиката XPath (т.е. в квадратных скобках) узел контекста является узлом, к которому применяется предикат.

В вашем случае, когда вы говорите $table/rows/row[x=@name], тогда @name относится к атрибуту @name row. Который не имеет атрибута @name, поэтому предикат всегда оценивается как false для всех узлов.

current() возвращает текущий узел контекста XSLT, чтобы помочь именно в этом случае.

...