我很困惑为什么XStylus在运行有关后代轴的查询时会返回此结果。
我有以下XML文件:
<?xml version=”1.0”?>
<!DOCTYPE BookStore System “BookStore.dtd”>
<BookStore BookStoreID=”BS112” Name =”CheapBooks” Location=”London” OwnerName =”Mr. Black”>
<Books BookID =”BK111” Title=”Introduction to reading” Authors =”Ian Green”>
</Books>
<Books BookID =”BK112” Title=”Introduction to Sleeping” Authors =”Peter White”>
</Books>
<Staff StaffID =”S333” Name =”Ana Car”>
<Manager ManagerID=”MG444” Name = “Mrs White” Address = “150 Wide Road, London SW10”>
</Manager>
</Staff>
</BookStore>
该文档格式正确,并根据该工具验证正常。现在,我想找到经理人管理的员工,其经理人数等于MG444。
我使用以下查询:
/child::BookStore/descendant:Staff[@ManageID='MG444']
我的理由是我正在寻找具有Staff后代的BookStore的子元素,该子元素具有具有特定值的ManagerID属性。 Stylus Studio什么都不返回。如果我跑
/child::BookStore/descendant:Staff
我得到整个Staff元素,而不仅仅是Manager。为什么 - 后代不应该只看下代,而不是当前节点和忽略属性?同样,为什么第一个查询不起作用?
答案 0 :(得分:2)
如果您正在寻找具有给定ManagerId的Staff元素,请使用:
/child::BookStore/descendant::Staff[Manager/@ManagerID='MG444']
因为ManagerID是Manager的属性而非来自Stuff 或更短
/BookStore//Staff[Manager/@ManagerID='MG444']
但是员工也是BookStore的孩子:
/BookStore/Staff[Manager/@ManagerID='MG444']
根据您的示例/child::BookStore/descendant:Staff
这是在BookStore寻找后代员工。这意味着在任何深度中搜索BookStore 的子项。它只会返回Stuff条目。
问:我得到了整个Staff元素,而不仅仅是Manager。为什么 - 后代不应该只看下代,而不是当前节点并忽略属性?
这是正确的:但您当前的节点是BookStore。
如果您正在寻找管理使用:
/BookStore/descendant::Manager
或
BookStore/Staff/Manager
更新: 问:是/ child :: BookStore / descendant:工作人员没有被解释为在BookStore中查找具有Staff作为后代的所有子元素(或者我对XPath的理解完全错误)?我不是在寻找经理,我正在寻找该经理所管理的员工。
在每个步骤的当前节点的解释中看起来像你的错误。
child::BookStore
查找任何node-name为BookStore的子节点到当前节点。
由于/
为“前缀”,因此绝对位置路径。
有关详细信息,请查看:Location Path Expression
而不是/descendant:Staffas
作为下一步:您正在寻找具有当前节点的节点名称Staff的后代。但现在当前的节点是BookStore。
该经理管理的员工
/BookStore/Staff[Manager/@ManagerID='MG444']
答案 1 :(得分:0)
您需要指定
//BookStore/Staff/descendant::Manager[@ManageID='MG444']
如果您有更多<Manager>
元素。执行上述查询后,我得到的结果低于结果。
Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[ManagerID] => MG444
[Name] => Mrs White
[Address] => 150 Wide Road, London SW10
)
[0] =>
)
)