0

我有一个带有谓词的 XPath 表达式,它使用 XPathNavigator.Select 方法从嵌套元素中选择一个人的姓名和 ID。

这有效:

root/all_clients/client/client_name_and_ID[client_ID = 'xxx']

这也有效:

root/all_clients/client[client_name_and_ID/client_ID = 'xxx']/client_name_and_ID

当我将谓词提升到一个新的水平时,它不起作用:

root/all_clients[client/client_name_and_ID/client_ID = 'xxx']/client/client_name_and_ID

我没有得到任何过滤,而是整个集合。

这是由于 XPath、ASP.NET 中固有的限制,还是我在做一些愚蠢的事情?

以下是相关 XML 文件的片段:

<?xml version="1.0" encoding="utf-8"?>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="file:///n:\Projects\XML\Medical\Example_01.xsd">

<all_clients>

    <client>
        <client_name_and_ID>
            <first_name>Fred</first_name>
            <middle_name>James</middle_name>
            <last_name>Bowman</last_name>
            <client_ID>1</client_ID>
        </client_name_and_ID>
    </client>

    <client>
        <client_name_and_ID>
            <first_name>Mark</first_name>
            <middle_name>David</middle_name>
            <last_name>Colder</last_name>
            <client_ID>2</client_ID>
        </client_name_and_ID>
    </client>

    <client>
        <client_name_and_ID>
            <first_name>Joe</first_name>
            <last_name>Lewis</last_name>
            <client_ID>3</client_ID>
        </client_name_and_ID>
    </client>

    <client>
        <client_name_and_ID>
            <first_name>Sam</first_name>
            <last_name>Plank</last_name>
            <client_ID>4</client_ID>
        </client_name_and_ID>
    </client>
</all_clients>

</root>
4

2 回答 2

0

最后一个查询匹配一个 all_clients 元素,该元素在其下包含任何匹配的客户端。然后它会在 all_clients 下选择未应用过滤器的客户端,因此它会选择所有客户端元素。

您应该将过滤器保存到 XPath 的末尾。首先选择您想要的元素类型,然后对这些元素应用过滤器。试试这些 XPath:

<!-- Select client_ID element. -->
root/all_clients/client/client_name_and_ID/client_ID[. = 'xxx']

<!-- Select client_name_and_ID element. -->
root/all_clients/client/client_name_and_ID[client_ID = 'xxx']

<!-- Select client element. -->
root/all_clients/client[client_name_and_ID/client_ID = 'xxx']
于 2011-02-11T18:18:28.047 回答
0

这很正常。所有client节点都是该节点的子all_clients节点。因此,它将始终符合条件“所有命名all_clients的元素至少有一个后代匹配client/client_name_and_ID/client_ID = 'xxx'”,这就是您编码的内容。

于 2011-02-11T18:19:00.230 回答