Xpath包含组合不起作用

时间:2015-07-02 15:27:21

标签: xml xpath contains

variable = 5
variable != 10 # => true
!variable # => false (5 is evaluated to true, then negated)
!variable = 10 # => warning: found = in conditional, should be ==

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

  <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>

尝试将它们组合起来

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

由于

1 个答案:

答案 0 :(得分:0)

我看到两个问题。

  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的孩子,则可以直接指定。{p>如果rim:ValueList可能不同,但rim:Value的深度相同,则可以使用*。如果这些都不知道,您可以使用//

  3. 以下是一些选项(绑定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|')]