【问题标题】:Check a specific node value with SimpleXMLElement :: xpath使用 SimpleXMLElement :: xpath 检查特定节点值
【发布时间】:2011-05-05 15:38:46
【问题描述】:

以下解决方案找到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);
                }
            }
  }

【问题讨论】:

    标签: xml xpath simplexml


    【解决方案1】:

    使用

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        相关资源
        最近更新 更多