Проверьте определенное значение узла с помощью SimpleXMLElement :: xpath - PullRequest
0 голосов
/ 05 мая 2011

Следующее решение находит поле данных с 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 голосов
/ 06 мая 2011

Используйте :

/*[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"

Второе выражение очень похоже, но оно непосредственно оценивается как строковое значение первого из текстовых узлов, выбранных первым выражением.

Эти выражения проще, чем в других ответах, потому что обратная ось вообще не используется и все предикаты указаны в их наиболее подходящем месте.

0 голосов
/ 05 мая 2011

Используйте xpath для прямой выборки нужного узла, если все условия применяются

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

...