0

xpath 1.0 - XML が変更されたため、アプローチを変更する必要がありました。

私は引っ張る必要があります

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>

私の当初の目的では、Passerbyのソリューションは魅力的に機能しましたが、追加のタスクを解決する方法がわかりません...

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

これが私の元のタスクです...

2 つの属性が特定の値を保持している 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 と id=2 のもの

1つの属性でそれを行う方法を知っていますが、OR / AND条件なしで...

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

1 に答える 1

1

試す

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

ライブデモ

$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";
}
于 2013-03-01T12:02:16.360 に答える