XPath后代轴

时间:2013-05-12 02:52:42

标签: xml xpath

我很困惑为什么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。为什么 - 后代不应该只看下代,而不是当前节点和忽略属性?同样,为什么第一个查询不起作用?

2 个答案:

答案 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] => 

        )

)