Xpath 包含组合不起作用

Xpath contains combined does not work

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

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

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

尝试将它们组合起来

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

谢谢

我看到两个问题。

  1. 您尝试 select (rim:Value) 的元素具有 rim 的命名空间前缀。这意味着在你的 XPath 中使用 Value 是行不通的,因为那会尝试在没有命名空间的情况下 select Value

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

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

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

    如果您确定 rim:Valuerim:ValueList 的子代,则可以直接指定它。如果rim:ValueList可以变化,但是rim:Value的深度是一样的,就可以用*。如果已知 none,则可以使用 //.

这里有几个选项(绑定 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|')]