【问题标题】:Xpath contains combined does not workXpath 包含组合不起作用
【发布时间】:2015-09-20 05:28:25
【问题描述】:
  <rim:Slot name="sourcePatientInfo">
                     <rim:ValueList>
                       <rim:Value>PID-3|ST-1000^^^&amp;1.3.6.1.4.1.21367.2003.3.9&amp;ISO</rim:Value>
                        <rim:Value>PID-5|Doe^John^^^</rim:Value>
                        <rim:Value>PID-7|999999</rim:Value>
                        <rim:Value>PID-8|M</rim:Value>
                        <rim:Value>PID-11|19999 St^^Metropolis^Il^44130^USA</rim:Value>
                     </rim:ValueList>

您好,我正在尝试从值部分获取数据。我没有发布整个 xml,因为它很大,但这是我在运行此 xpath //*[@name='sourcePatientInfo'] 后得到的部分。我想在此之后添加一个包含以提取 PID-3 文本,但我的代码在此处包含无效代码。

./Value[contains(., 'PID-3|')]]

试图将它们结合起来

//*[@name='sourcePatientInfo' and ./Value[contains(., 'PID-3|')]]

谢谢

【问题讨论】:

    标签: xml xpath contains


    【解决方案1】:

    我发现了两个问题。

    1. 您尝试选择的元素 (rim:Value) 的命名空间前缀为 rim。这意味着在 XPath 中使用 Value 将无法正常工作,因为这会尝试在无命名空间中选择 Value

      如果您使用的工具允许您将前缀绑定到命名空间 URI,请将其绑定到输入 XML 中将 rim 绑定到的任何命名空间 URI。然后,您可以在 XPath 中使用 rim(或您将命名空间 URI 绑定到的任何前缀)。

      如果该工具不允许将命名空间 URI 绑定到前缀,您可以使用 local-name()(最好是 namespace-uri())。

    2. rim:Valuerim:Slot 的后代(具有正确的@name),而不是直接子代。这意味着./Value(或./rim:Value)不会选择任何东西。

      如果您确定rim:Valuerim:ValueList 的子代,则可以直接指定它。如果rim:ValueList 可以变化,但rim:Value 的深度相同,则可以使用*。如果这些都不知道,您可以使用//

    这里有几个选项(rim 绑定)...

    //*[@name='sourcePatientInfo']/rim:ValueList/rim:Value[contains(.,'PID-3|')]
    
    //*[@name='sourcePatientInfo']/*/rim:Value[contains(.,'PID-3|')]
    
    //*[@name='sourcePatientInfo']//rim:Value[contains(.,'PID-3|')]
    

    如果无法绑定命名空间...

    //*[@name='sourcePatientInfo']//*[local-name()='Value'][contains(.,'PID-3|')]
    

    使用local-name() 的示例将匹配本地名称为Value 的任何元素,无论它位于哪个命名空间中。要在您的XPath 中更具体,您可以添加namespace-uri()...

    //*[@name='sourcePatientInfo']//*[local-name()='Value' and namespace-uri()='some namespace uri'][contains(.,'PID-3|')] 
    

    【讨论】:

    • 好的,谢谢。这样可行。同样是的,命名空间对我来说是个问题,因为它可能会改变,所以我使用了也可以工作的本地。
    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 2019-07-29
    • 2014-07-23
    • 2018-11-28
    • 2017-09-23
    • 2016-02-17
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多