使用SimpleXMLElement :: xpath检查特定节点值

时间:2011-05-05 15:38:46

标签: xml xpath simplexml

以下解决方案使用tag="100"查找数据字段,并使用code="a"获取子字段的值。现在我意识到我还需要检查是否存在code="4"的子字段,如果是,则检查该值是否为xyz,如果该条件为真,则仅获取子字段code="a"值。如何更改代码才能执行此操作?

XML:

<datafield tag="100">
   <subfield code="a">value
   </subfield>
   <subfield code="4">xyz   
   </subfield>
</datafield>

 if($datafield['tag']=='100'){
            $datafield->registerXPathNamespace('foo', 'http://www.loc.gov/MARC21/slim');
            foreach( $datafield->xpath('foo:subfield') as $sf ) {
                if($sf['code']=='a'){
                    $auth=func($sf);
                }
            }
  }

2 个答案:

答案 0 :(得分:0)

如果适用所有条件,则使用xpath直接获取所需节点

/datafield[@tag='100']/subfield[@code='a'][normalize-space(../subfield[@code='4']) = 'xyz']

答案 1 :(得分:0)

使用

/*[subfield[@code=4 and normalize-space()='xyz']]
                                 /subfield[@code='a']/text()

或使用

string(/*[subfield[@code=4 and normalize-space()='xyz']]
                                          /subfield[@code='a'])

上面的第一个XPath表达式选择顶部元素的所有subfield子元素的所有文本节点子节点,其code属性的值为"a",但仅当顶部元素具有一个subfield子项,其code属性的值为4,并且在删除前导和尾随空白字符后的字符串值为"xyz"

第二个表达式非常相似,但它直接计算第一个表达式选择的第一个文本节点的字符串值。

这些表达式比其他答案中的表达式更简单,因为根本没有使用反向轴,所有谓词都指定在最合适的位置。