Вы можете вкладывать и комбинировать условия. Итак, шаг за шагом:
- Выбрать любой
datafield
элемент
//N:datafield
- ... с атрибутом
tag
, то есть 550
//N:datafield[@tag="550"]
- ... и с дочерним элементом
subfield
//N:datafield[@tag="550" and N:subfield]
- ... с атрибутом
code
со значением i
//N:datafield[@tag="550" and N:subfield[@code="i"]]
- ... текстовое содержание этого
subfield
должно быть Funktion
//N:datafield[@tag="550" and N:subfield[@code="i"] = "Funktion"]
- ... и получите
subfield
ребенка datafield
//N:datafield[@tag="550" and N:subfield[@code="i"] = "Funktion"]/N:datafield
- ... с атрибутом
code
со значением a
//N:datafield[@tag="550" and N:subfield[@code="i"] = "Funktion"]/N:datafield[@code="a"]
Для второго выражения вы можете просто использовать not()
для этого конкретного выражения.
- ... текстовое содержание этого
subfield
должно быть Funktion
//N:datafield[@tag="550" and not(N:subfield[@code="i"] = "Funktion")]
Пробелы в выражениях Xpath в основном игнорируются (не раньше, чем ведущий /
). Таким образом, вы можете обернуть и сделать отступы, чтобы сделать их более читабельными.
Составьте:
$xml = <<<'XML'
<foo xmlns="http://www.loc.gov/MARC21/slim">
<datafield tag="550">
<subfield code="a">Text</subfield>
<subfield code="i">Funktion</subfield>
</datafield>
<datafield tag="550">
<subfield code="a">Grafiker</subfield>
<subfield code="i">Beruf</subfield>
</datafield>
</foo>
XML;
$element = new SimpleXMLElement($xml);
$element->registerXPathNamespace( 'N', 'http://www.loc.gov/MARC21/slim');
$expression = '//N:datafield[
@tag="550" and N:subfield[@code="i"] = "Funktion"
]/N:subfield[@code="a"]';
foreach ($element->xpath($expression) as $field) {
var_dump((string)$field);
}
echo str_repeat('-', 25), "\n";
$expression = '//N:datafield[
@tag="550" and not(N:subfield[@code="i"] = "Funktion")
]/N:subfield[@code="a"]';
foreach ($element->xpath($expression) as $field) {
var_dump((string)$field);
}
Выход:
string(4) "Text"
-------------------------
string(8) "Grafiker"