XPath, где требования применяются к более глубоким узлам, чем те, что в результирующем наборе - PullRequest
2 голосов
/ 06 января 2010

В моем ответе на другой пост в SO (здесь: SharePoint 2007, как проверить, существует ли папка в библиотеке документов ), мне пришлось проанализировать документ XML со структурой:

D:multistatus
|--D:response
|----D:propstat
|-------D:prop
|----------D:displayname
|----------D:isFolder

Можно ли построить оператор XPath, который выбирает набор таких D:response элементов, которые содержат D:displayname, равный "someName", а D:isFolder равно "t"?

Я знаю, как это сделать, если я выберу все элементы D:response, а затем переберу набор результатов, но я считаю, что XPath достаточно мощный, чтобы сделать это более тонким способом.

Ответы [ 3 ]

4 голосов
/ 06 января 2010
//D:response[D:propstat/D:prop/D:displayname="someName" and D:propstat/D:prop/D:isFolder="t"]
2 голосов
/ 06 января 2010

Если displayname и isFolder могут появляться в любом месте в пределах D:response, то это должно работать.

//D:response//[D:displayname="someName" and D:isFolder="t"]

// означает, что узел может появиться в любом месте иерархии, а

[...] - это предикат, используемый для фильтрации элементов, соответствующих заданным критериям.

1 голос
/ 06 января 2010

Более короткий и эффективный вариант ответа @Jimmy Zhang:

/*/D:response[D:propstat/D:prop[D:displayname='someName' and D:isFolder='t']]

Избегает неэффективного оператора // (который без необходимости проверяет все дерево, когда положение целевого элемента фактически известно). Также он использует вложенный предикат, чтобы избежать избыточности.

...