以下解决方案使用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);
}
}
}
答案 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"
第二个表达式非常相似,但它直接计算第一个表达式选择的第一个文本节点的字符串值。
这些表达式比其他答案中的表达式更简单,因为根本没有使用反向轴,所有谓词都指定在最合适的位置。