【发布时间】:2013-07-05 21:17:44
【问题描述】:
这是我的 XML (sn-p):
<?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>
我想要完成的事情:<item id="1"> 是否有 label_position 属性集?
(1) 如果是,请退回。
(2) 如果不是,请检查该节点的父节点的该属性。
(3) 如果父级有属性,则返回。
(4) 如果没有,转步骤(2)。 <body> 是要检查的“最旧”节点。
我的尝试:
我正在使用simplexml 和xpath,我尝试选择<item> 及其所有祖先,然后向上遍历树并在第一次出现label_position 时停止。
$xml->xpath("//item[@id='1']::ancestors-or-self/@label_position");
产生了一个invalid expression。
(1) 如何使这个表达式起作用?
(2) 这可以用“xpath-only”来完成吗 - 不遍历树并进行搜索?
编辑:多亏了 choroba 和 dirkk,我才得以将它们组合在一起:
$test = (string)array_reverse($xml->xpath("//item[@id='2']/ancestor-or-self::*/@label_position"))[0];
解释:如果<item> 和<body> 都具有该属性,xpath 将返回一个包含这两个值的数组,<body> 第一个。在这种情况下,我想先获得<item>,这就是为什么array_reverse()。
【问题讨论】: