2011-05-05 67 views
0

以下解決方案找到含有tag="100"的數據字段並獲取code="a"的子字段值。現在我意識到我還需要檢查是否存在code="4"的子字段,如果是,請檢查值是否爲xyz,如果條件爲真,則只檢索子字段code="a"的值。我如何更改代碼才能做到這一點?使用SimpleXMLElement :: xpath檢查特定節點值

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

使用

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

或者使用

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

上面的第一個XPath表達式選擇用於其中其code屬性的值是"a"但僅當所述頂部元件的所有subfield兒童的所有文本節點的孩子top元素有一個subfield孩子,其code屬性的值爲4,並且刪除前導和尾隨空白字符後的字符串值爲"xyz"

第二個表達式非常相似,但它直接求值爲第一個表達式選擇的第一個文本節點的字符串值。

這些表達式比其他答案中的表達式更簡單,因爲根本沒有使用反轉軸,並且所有謂詞都在其最合適的位置指定。

0

使用XPath直接獲取所需的節點,如果所有條件適用

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