如何使用 Xpath 和 Xquery 从属性中提取 text()?
How to use Xpath and Xquery to extract text() from an attribute?
尝试使用 xpath
和 xquery
查询电子邮件地址,但在
时没有得到任何结果
简单查询:
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 也用于输出元素,因此您最终可能会在该名称空间中得到结果元素。
尝试使用 xpath
和 xquery
查询电子邮件地址,但在
简单查询:
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 也用于输出元素,因此您最终可能会在该名称空间中得到结果元素。