2013-03-01 1 views
0

xpath 1.0 - Мне пришлось изменить подход, потому что XML изменился.php xpath выбирает узлы на основе значений двух атрибутов (редактировать) И атрибуты его родителей

мне нужно вытащить

t-Attribute FROM the <d>-node WHERE its 
    raw-Attribute = 10 
    AND its parent-node's <scale> gender-Attribute = "*" OR "m" 
    AND the age-Attribute = "*" OR "39-59" 

<scales> 
    <scale id="1" gender="*" age="*"> 
     <d scid="hi" raw="10" t="76" /> 
     <d scid="pn" raw="12" t="80" /> 
    </scale> 
    <scale id="2" gender="m" age="*"> 
     <d scid="hi" raw="8" t="79" /> 
     <d scid="pn" raw="2" t="50" /> 
    </scale> 
    <scale id="3" gender="*" age="19-39"> 
     <d scid="hi" raw="0" t="48" /> 
     <d scid="pn" raw="10" t="49" /> 
    </scale> 
</scales> 

Для моей первоначальной цели, решение прохожего работало как шарм, но я не могу понять, как решить дополнительную задачу ...

$result=$xml->xpath('//scale[@gender="*" or @gender="m"][@age="*" or @age="39-59"]'); 

Вот моя оригинальная задача ...

Я хочу выбрать узлы из xml, где два атрибута содержат определенные значения. Я использую simplexml, поэтому xpath должен быть 1.0.

XML фрагмент:

<scales> 
    <scale id="1" gender="*" age="*"> 
     <d>5</d> 
     <d>9</d> 
    </scale> 
    <scale id="2" gender="m" age="*"> 
     <d>3</d> 
     <d>0</d> 
    </scale> 
    <scale id="3" gender="*" age="19-39"> 
     <d>12</d> 
     <d>19</d> 
    </scale> 
</scales> 

Теперь я хочу, чтобы выбрать все <scale>, которые имеют ...

(gender="*" OR gender="m") AND (age="*" OR age="39-59") 

в моем примере те, с ID = 1 и ид = 2

Я знаю, как это сделать с 1 атрибутом, но без условий OR/AND ...

$scales=$xml->xpath("//scale[@gender='m']"); 

ответ

1

Попробуйте

//scale[@gender="*" or @gender="m"][@age="*" or @age="39-59"] 

Live demo

$str=<<<XML 
<scales> 
    <scale id="1" gender="*" age="*"> 
     <d>5</d> 
     <d>9</d> 
    </scale> 
    <scale id="2" gender="m" age="*"> 
     <d>3</d> 
     <d>0</d> 
    </scale> 
    <scale id="3" gender="*" age="19-39"> 
     <d>12</d> 
     <d>19</d> 
    </scale> 
</scales> 
XML; 
$xml=simplexml_load_string($str); 
$result=$xml->xpath('//scale[@gender="*" or @gender="m"][@age="*" or @age="39-59"]'); 
foreach($result as $node) 
{ 
    echo $node->attributes()->id."\n"; 
} 
+0

фантастическим, спасибо! – michi

+0

должен был настроить мою цель с помощью этого xpath, не могли бы вы взглянуть на нее, если это нормально для вас? http://stackoverflow.com/questions/15158314/php-xpath-retrieving-attribute-values-based-on-multiple-attributes-and-parent-at#comment21344739_15158314 – michi

Смежные вопросы