0

我对为什么 XStylus 在运行有关后代轴的查询时返回此结果感到困惑。

我有以下 XML 文件:

<?xml version=”1.0”?>
<!DOCTYPE BookStore System “BookStore.dtd”&gt;
<BookStore BookStoreID=”BS112” Name =”CheapBooks” Location=”London” OwnerName =”Mr. Black”&gt;
    <Books BookID =”BK111” Title=”Introduction to reading” Authors =”Ian Green”&gt;
    </Books>
    <Books BookID =”BK112” Title=”Introduction to Sleeping” Authors =”Peter White”&gt;
    </Books>
    <Staff StaffID =”S333” Name =”Ana Car”&gt;
        <Manager ManagerID=”MG444” Name = “Mrs White” Address = “150 Wide Road, London SW10”&gt;
        </Manager>
    </Staff>
</BookStore>

该文档格式正确,并根据该工具进行了良好的验证。现在,我想找到 ManagerID 等于 MG444 的经理管理的员工。

我使用以下查询:

 /child::BookStore/descendant:Staff[@ManageID='MG444']

我的理由是我正在寻找 BookStore 的子元素,该子元素具有 Staff 后代,该后代具有具有特定值的 ManagerID 属性。Stylus Studio 不返回任何内容。如果我跑

 /child::BookStore/descendant:Staff

我得到了整个员工元素,而不仅仅是经理。为什么-后代不应该只查看后代,而不是当前节点并忽略属性?同样,为什么第一个查询不起作用?

4

2 回答 2

2

如果您正在寻找具有给定 ManagerId 的 Staff 元素,请使用以下命令:

/child::BookStore/descendant::Staff[Manager/@ManagerID='MG444']

因为 ManagerID 是来自 Manager 而不是来自 Stuff 的属性。
或者更短

/BookStore//Staff[Manager/@ManagerID='MG444']

但 Staff 也是 BookStore 的孩子:

/BookStore/Staff[Manager/@ManagerID='MG444']

根据你的例子/child::BookStore/descendant:Staff

这是在书店寻找后代员工。这意味着在任何深度搜索 Staff 作为 BookStore 的孩子。它只会返回 Stuff 条目。

问:我得到了整个员工元素,而不仅仅是经理。为什么-后代不应该只查看后代,而不是当前节点并忽略属性?

这是正确的:但是您当前的节点是 BookStore。

如果您正在寻找管理使用:

/BookStore/descendant::Manager

或者

BookStore/Staff/Manager

更新:问:/child::BookStore/descendant:Staff 是否没有解释为在 BookStore 中查找所有将 Staff 作为后代的子元素(或者我对 XPath 的理解完全错误)?我不是在寻找经理,我在寻找由该经理管理的员工。

看起来您在解释每个步骤的当前节点时出现了错误。

child::BookStore查找节点名称为 BookStore 的任何子节点到当前节点。因为/作为“前缀”,这是一个绝对位置路径。有关更多信息,请查看:位置路径表达式

而不是/descendant:Staffas下一步您正在寻找当前节点的节点名称为 Staff 的后代。但现在当前节点是 BookStore 的。

由该经理管理的员工

/BookStore/Staff[Manager/@ManagerID='MG444']
于 2013-05-12T04:27:12.590 回答
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] => 

        )

)
于 2013-05-12T03:04:41.583 回答