如何使用 Xpath 和 Xquery 从属性中提取 text()?

How to use Xpath and Xquery to extract text() from an attribute?

尝试使用 xpathxquery 查询电子邮件地址,但在

时没有得到任何结果

简单查询:

xquery version "3.1";

for $contact in db:open("sample")

return $contact

数据:

<Objs xmlns="http://schemas.microsoft.com/powershell/2004/04" Version="1.1.0.1">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCustomObject</T>
      <T>System.Object</T>
    </TN>
    <MS>
      <S N="First Name">a</S>
      <S N="Last Name">b</S>
      <S N="Emails">a@b;b@a.com</S>
      <S N="Phones">123 456-8904</S>
      <S N="Company Name"/>
    </MS>
  </Obj>
  <Obj RefId="1">
    <TNRef RefId="0"/>
    <MS>
      <S N="First Name">c</S>
      <S N="Last Name">c</S>
      <S N="Emails">e@f.com</S>
      <S N="Phones">123456-3532;563 346-3453</S>
      <S N="Company Name"/>
    </MS>
  </Obj>
</Objs>

我正在寻找 Objs/Obj/MS/S[N="emails"]/text() 沿着这些路线获取属性的实际内容。

我没有你的 XML 数据库...

您可以尝试以下操作。

XQuery

xquery version "3.1";

declare namespace ns1="http://schemas.microsoft.com/powershell/2004/04" Version="1.1.0.1";

for $contact in db:open("sample")//ns1:S[@N="Emails"]/text()
return $contact

有两个问题,如果您希望谓词检查属性,请使用 Objs/Obj/MS/S[@N="emails"]/text() 而不是 Objs/Obj/MS/S[N="emails"]/text()。当然,使用名称空间和默认设置,路径 selects 元素不在名称空间中,而您的文档将它们放在名称空间中,因此您可以在 XQuery 中声明

declare default element namespace "http://schemas.microsoft.com/powershell/2004/04";

然后 select 例如/Objs/Obj/MS/S[@N="Emails"]/text()(另一个小修正是字符串文字 Emails 而不是 emails

请注意,在 XQuery 中声明的默认元素名称空间既用于路径 selection 也用于输出元素,因此您最终可能会在该名称空间中得到结果元素。