Сопоставление атрибута XPath и содержимого элемента

Может ли кто-нибудь помочь со следующим вопросом 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]]


person gerrod    schedule 21.04.2010    source источник
comment
вы можете опубликовать фактический XML с угловыми скобками, если вы просто выделите строки XML, а затем нажмите кнопку кода (101 010) на панели инструментов редактора. Нет необходимости вручную заменять все угловые скобки на и .....   -  person marc_s    schedule 21.04.2010
comment
Ооо, спасибо за подсказку. Я знал, что должен был быть более простой способ :-)   -  person gerrod    schedule 21.04.2010


Ответы (1)


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

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

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

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

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

person Tomalak    schedule 21.04.2010
comment
Отлично, спасибо Томалак. Я придумал обходной путь, сначала скопировав атрибут @name в переменную, но ваш вариант намного лучше. - person gerrod; 21.04.2010
comment
Я не думаю, что вам нужен current(), может быть, я ошибаюсь, но разве current() не совпадает с '.'? - person vtd-xml-author; 22.04.2010
comment
@vtd: Да, вы ошибаетесь. Если бы current() было таким же, как ., то current() не существовало бы. ;) - person Tomalak; 22.04.2010
comment
когда бы они не были равны тогда? - person vtd-xml-author; 22.04.2010
comment
@vtd: вне предиката XPath. - person Tomalak; 22.04.2010