これは私の XML (スニペット) です。
<?xml version="1.0" encoding="utf-8"?>
<test>
<body label_position="left">
<page number="1">
<itemset name="">
<item name="" id="1" />
<item name="" id="2" label_position="right" />
</itemset>
</page>
</body>
</test>
達成したいこと:属性セットはあります
か?
(1) その場合は返却してください。
(2) そうでない場合は、ノードの親でその属性を確認します。
(3) 親が属性を持っている場合は、それを返します。
(4) そうでない場合は、手順 (2) に進みます。チェックする「最も古い」ノードです。 <item id="1">
label_position
<body>
私が試したこと:
私は と を使用してsimplexml
おりxpath
、 とそのすべての祖先を選択してから<item>
、ツリーを上に移動して の最初の出現で停止しようとしましたlabel_position
。
$xml->xpath("//item[@id='1']::ancestors-or-self/@label_position");
を生産したinvalid expression
。
(1) この式を機能させるにはどうすればよいですか?
(2)これは「xpathのみ」で実行できますか?ツリーをトラバースして検索を実行する必要はありませんか?
編集:choroba と dirkk のおかげで、私はそれをまとめることができました:
$test = (string)array_reverse($xml->xpath("//item[@id='2']/ancestor-or-self::*/@label_position"))[0];
説明:と の両方が属性<item>
を持っている場合、両方の値を持つ配列が返されます。この場合、最初に取得したいのはそのためです。<body>
xpath
<body>
<item>
array_reverse()
動作を確認してください: http://codepad.viper-7.com/jDPIde