4

これは私の 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

4

2 に答える 2

2

XPath が無効です。軸のステップは、要素名の前にある必要があります。たとえば、 のようなものaxis::nodeで、その逆ではありません。

以下はうまくいくはずです。あなたのロジックはすでに xpath のみであり、ツリーをトラバースしてもまったく問題ありません。

(//item[@id='1']/ancestor-or-self::*/@label_position)[last()]
于 2013-07-08T14:10:03.000 に答える