【问题标题】:XPath Query local-name() - fetch tag based on other tag's valueXPath Query local-name() - 根据其他标签的值获取标签
【发布时间】:2014-02-21 07:42:37
【问题描述】:

我有以下 xml 格式。我需要获取 'typename1' 并写了 //*[local-name() = 'type-name' 和 text() ='typeName1']。如果 'type-name' 是 'typeName1' 使用 XPath 查询表达式,有人可以帮助我如何获取 'objectid1'。

    <?xml-stylesheet type="text/xsl" href="/API/xsl/abcde.xml" ?>
    <name xmlns="http://www.ccc.org/2011/SSS" xmlns:hostmgmt='http://www.xyzw.com/abcd'>
       <title type="text">test</title>   
       <content>
          <id>48035</id>      
          <host-contacts>
             <host-contact>
                <host-contact-type>Employee</host-contact-type>
                <host-contact-role>Role</host-contact-role>
                <host-contact-name>Employee Name</host-contact-name>
             </host-contact>
          </host-contacts>
          <syslog-messages>N</syslog-messages>      
          <services>
             <service>            
                <objectid>objectid1</objectid>
                <type-name>typeName1</type-name>
             </service>
             <service>            
                <objectid>objectid2</objectid>
                <type-name>typeName2</type-name>
             </service>
          </services>
          <building>ABC</building>
          <asset>XYZ</asset>
       </content>
    </name>

【问题讨论】:

    标签: xpath


    【解决方案1】:

    您为什么不直接声明命名空间并使用正常的轴步骤而不是local-name() hacks(忽略命名空间)?声明命名空间在不同的编程语言中是不同的,但对于大多数语言来说都相当简单明了。

    //sss:service[sss:type-name='typeName1']/sss:objectid
    

    【讨论】:

    • 我试过了,但是得到一个错误'Error:DOMXPath::evaluate() [domxpath.evaluate]: Invalid expression'。因此尝试使用 local-name()
    • 看来您在 PHP 中使用 XPath 和 DOMXPath。在那里注册命名空间非常容易。也许您最好发布遇到问题的代码,而不是寻找解决方法,我很确定我们会找到一个简单的解决方案。最好将其编辑到您的问题中。
    • 语法没有变化,只是在标签前增加了命名空间。无论如何,这是一个:
    • ccc.org/2011/SSS" xmlns:hostmgmt='@987654322 @'> test 48035员工 角色员工姓名host-contact-name> N
    • objectid1typeName1服务> objectid2typeName2ABC XYZ
    【解决方案2】:

    试试下面的xpath

    //*[local-name()='service'][child::*[local-name()='type-name'][.='typeName1']]/*[local-name()='objectid']/text()
    

    它说找到一个节点的(本地名称为service)(子节点的本地名称为type-name,其值等于“typeName1”)本地名称为objectid的子内容

    【讨论】:

    • 感谢您的回复,按预期工作。我是 XPath 查询语法的新手,你能解释一下上面的表达式吗?我不确定标签“objectid”是否总是在标签“type-name”之前。还有其他替代方法吗?
    • 请通过接受答案关闭此问题,单击左侧箭头下方的复选标记。
    【解决方案3】:

    试试这个.. //服务[type-name="typeName1"]/objectid 另一个例子可以是 //*[local-name() = 'type-name' and text() ='typeName1']/objectid

    【讨论】:

    • 上面的表达式如果有Namespace,是否需要修改?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多