Фильтрация узлов MetaData из xpath-запроса в magnolia jcr

У меня проблема с фильтрацией определенных узлов кролика jcr в магнолии.

когда я отправляю следующий запрос: //element(*, standort)//*

я получил:

33 nodes returned in 18ms
/standort/Standorte/MetaData
/standort/Standorte/standort-de
/standort/Standorte/standort-de/MetaData
/standort/Standorte/standort-de/Teststandort
/standort/Standorte/standort-de/Teststandort/MetaData
/standort/Standorte/standort-de/Hauptwerk-Köln
/standort/Standorte/standort-de/Hauptwerk-Köln/MetaData
/standort/Standorte/standort-de/Geschäftsstelle-Berlin
/standort/Standorte/standort-de/Geschäftsstelle-Berlin/MetaData
/standort/Standorte/standort-de/Geschäftsstelle-Frankfurt
/standort/Standorte/standort-de/Geschäftsstelle-Frankfurt/MetaData
/standort/Standorte/standort-de/Geschäftsstelle-Hamburg
/standort/Standorte/standort-de/Geschäftsstelle-Hamburg/MetaData
/standort/Standorte/standort-de/Geschäftsstelle-Hannover
/standort/Standorte/standort-de/Geschäftsstelle-Hannover/MetaData
/standort/Standorte/standort-de/Geschäftsstelle-Köln
/standort/Standorte/standort-de/Geschäftsstelle-Köln/MetaData
/standort/Standorte/standort-de/Werk-Leipzig
/standort/Standorte/standort-de/Werk-Leipzig/MetaData
/standort/Standorte/standort-de/Geschäftsstelle-München
/standort/Standorte/standort-de/Geschäftsstelle-München/MetaData
/standort/Standorte/standort-de/Geschäftsstelle-Stuttgart
/standort/Standorte/standort-de/Geschäftsstelle-Stuttgart/MetaData
/standort/Standorte/standort-de/Gelsdorf-(Mischwerk)
/standort/Standorte/standort-de/Gelsdorf-(Mischwerk)/MetaData
/standort/Standorte/standort-de/Gelsdorf-(Handläufe)
/standort/Standorte/standort-de/Gelsdorf-(Handläufe)/MetaData
/standort/Standorte/standort-de/KB-Roller-Tech-Kopierwalzen-GmbH
/standort/Standorte/standort-de/KB-Roller-Tech-Kopierwalzen-GmbH/MetaData
/standort/Standorte/standort-en
/standort/Standorte/standort-en/MetaData
/standort/Standorte/standort-en/Böttcher-UK-Ltd-
/standort/Standorte/standort-en/Böttcher-UK-Ltd-/MetaData

Но мне нужны только узлы:

/standort/Standorte/standort-de/Teststandort
/standort/Standorte/standort-de/Hauptwerk-Köln
/standort/Standorte/standort-de/Geschäftsstelle-Berlin
/standort/Standorte/standort-de/Geschäftsstelle-Frankfurt
/standort/Standorte/standort-de/Geschäftsstelle-Hamburg
/standort/Standorte/standort-de/Geschäftsstelle-Hannover
/standort/Standorte/standort-de/Geschäftsstelle-Köln
/standort/Standorte/standort-de/Werk-Leipzig
/standort/Standorte/standort-de/Geschäftsstelle-München
/standort/Standorte/standort-de/Geschäftsstelle-Stuttgart
/standort/Standorte/standort-de/Gelsdorf-(Mischwerk)
/standort/Standorte/standort-de/Gelsdorf-(Handläufe)
/standort/Standorte/standort-de/KB-Roller-Tech-Kopierwalzen-GmbH
/standort/Standorte/standort-en/Böttcher-UK-Ltd-

таким образом, без узлов MetaData и родительских узлов. Мне нужно все, что ниже Standorte. Потомки Standorte могут иметь тип standort-de или standort-en. Я надеюсь, что смогу прояснить свою проблему. Я сократил свой вывод в последней версии своего вопроса. Пока я не нашел ни одного xpath-выражения, которое могло бы мне помочь. Но это из-за отсутствия у меня знаний о xpath.

Заранее спасибо!


person meltac    schedule 15.12.2010    source источник
comment
Странный результат! Также следует выбрать /standort/Standorte. Если вы работаете с PSVI, почему бы вам не сопоставить аннотацию типа Teststandort?   -  person    schedule 15.12.2010
comment
@ Алехандро: хм, я не знаю. возможно, xpath работает по-другому при выборе узлов в jackrabbit.   -  person meltac    schedule 15.12.2010
comment
Тогда элемент Standorte имеет аннотацию типа standort, и результат сообщает полный абсолютный путь выбранных узлов.   -  person    schedule 15.12.2010
comment
Хороший вопрос, +1. Решение см. В моем ответе - все, что нужно - это простая настройка. :)   -  person Dimitre Novatchev    schedule 15.12.2010


Ответы (2)


Выражение

//element(*, standort)//*

выбирает любой элемент (последний *), который является потомком (вторым //) элемента в любом месте документа (//element()), который был успешно проверен на соответствие определению типа, определенного схемой для standort. (Спасибо @Alej за помощь в исправлении этого и следующих утверждений.)

Таким образом, в основном вы выбираете каждый элемент, который является потомком проверенного элемента standort, предполагая, что у вас есть успешно присоединенная схема.

Попробуйте выражение XPath (обновлено):

/standort/Standorte/(standort-de | standort-en)/*
person LarsH    schedule 15.12.2010
comment
@LarsH: это XPath 2.0, и второй аргумент для проверки узла element() соответствует аннотации типа. - person ; 15.12.2010
comment
я надеюсь, что мой уточненный вопрос будет лучше для понимания. Естественно, я имел в виду не узел '/', а родители листьев - person meltac; 15.12.2010
comment
@meltac, вы пробовали выражение XPath /standort/Standorte/(standort-de | standort-en)/*, и каков был результат? - person LarsH; 15.12.2010
comment
@Alej: спасибо, я был ленив и не проверил определения аргументов для element () ... Я предположил, что *, standort был последовательностью, забыв, что последовательность может быть выражена как аргумент только с помощью дополнительных круглых скобок. Я исправлю свой ответ. - person LarsH; 15.12.2010
comment
@LarsH: спасибо за подсказку. Но, к сожалению, у меня это не работает. Если я введу ur-запрос, то верну пустой набор результатов. - person meltac; 15.12.2010
comment
@meltac: Думаю, вам лучше опубликовать образец входного XML. Мне интересно, находится ли это в пространстве имен или что-то в этом роде. - person LarsH; 16.12.2010
comment
@meltac, извините, я только что узнал о jackrabbit / JCR, что элемент верхнего уровня всегда _1 _..., несмотря на вводящие в заблуждение выходные данные, полученные вами в результате вашего запроса. Так как насчет - person LarsH; 16.12.2010
comment
@meltac, у вас есть документы о том, какие именно функции XPath поддерживает Jackrabbit? Несмотря на то, что Jackrabbit использует грамматику XQuery, он реализует только набор функций XPath, требуемых JCR-170 (и некоторые дополнительные функции, такие как предикаты на этапах определения местоположения). wiki.gxdeveloperweb.com/confluence/display/GXDEV/ - person LarsH; 16.12.2010
comment
@meltac: следующая попытка: //element(*, standort)/standort-de | //element(*, standort)/standort-en - person LarsH; 16.12.2010
comment
@meltac: если XPath Jackrabbit не поддерживает оператор объединения, выражение в предыдущем комментарии не будет работать. Но в этом случае вы можете попробовать //element(*, standort)/standort-de и //element(*, standort)/standort-en как отдельные запросы и объединить результаты. - person LarsH; 16.12.2010
comment
К вашему сведению, ветка mail-archive.com/users@jackrabbit. apache.org/msg06032.html указывает на отсутствие списка функций XPath, поддерживаемых Jackrabbit. :-( Однако спецификация JSR-170 говорит, что оператор объединения требуется для поддержки; но следующее не требуется: для / return, переменные, if, любые оси в том числе ... - person LarsH; 16.12.2010
comment
спасибо за ваши комментарии, но это не сработает. оба выражения не работают. оператор and возвращает то же сообщение об ошибке, что и выражение dimitres. В любом случае большое спасибо за твою большую помощь. Я попытаюсь покопаться в документации о кроликах, чтобы найти решение. должен быть способ ... - person meltac; 17.12.2010
comment
@meltac, я не знаю, о каком операторе и вы говорите ... ни одно из моих выражений не содержит и. Однако профсоюз должен работать так, как того требует JSR-170. Что делает //element(*, standort)/standort-de | //element(*, standort)/standort-en? - person LarsH; 17.12.2010
comment
@LarsH: извините, я скопировал выражения из 4 комментариев выше. Но я не видел, чтобы было 2, разделенных знаком и. И это было точно такое же выражение, как и с оператором |. Если я запустил выражение ur, я получу ноль результатов. Это сбивает с толку, поскольку я получаю результат для каждого отдельного выражения. Но | должно быть разрешено, потому что кролик обычно жалуется на неправильно размещенные или неизвестные символы. Спасибо за подсказку с аннотацией обратных кавычек - person meltac; 17.12.2010

Использование:

(//element(*, standort)//*)[not(ancestor-or-self::MetaData)]
person Dimitre Novatchev    schedule 15.12.2010
comment
@Dimitre: Спасибо, этот запрос также звучит очень самоочевидно, но xpath возвращает следующую ошибку: null for statement: for $ v in (// element (, standort) //) [not (ancestor -или-self :: MetaData)] вернуть $ v: null - person meltac; 15.12.2010
comment
@meltac: В моем ответе нет $v. Я только гарантирую, что мой ответ правильный - все, что выходит за рамки этого, может быть правильным, а может и нет. Кроме того, похоже, что в вашем выражении есть опечатка - * отсутствует более чем в одном месте. Если вы не выбрали ни одного узла, но действительно получили выбранные узлы, указанные в вашем вопросе, значит, ваш механизм XPath сломан. Я сделал две вещи: 1. Взял ваше выражение и заключил его в квадратные скобки. При этом должны быть выбраны те же узлы. 2. Добавлен предикат, который фильтрует любой узел, являющийся MetaData или имеющий предка Metadata. Это должно работать. - person Dimitre Novatchev; 15.12.2010
comment
@Dimitre - я думаю, что символы *, отсутствующие в его комментарии, были проанализированы как курсивная разметка. - person LarsH; 16.12.2010
comment
@LarsH: Тем более что его движок Xpath, должно быть, довольно глючит. - person Dimitre Novatchev; 16.12.2010
comment
@meltac, вы должны заключать в комментарии обратные кавычки, чтобы этого не произошло. +1 к @Dimitre за хороший ответ. - person LarsH; 16.12.2010
comment
@Dimitre, страница wiki.gxdeveloperweb.com/confluence/display В / GXDEV / говорится, что даже несмотря на то, что Jackrabbit использует грамматику XQuery, он реализует только набор функций XPath, требуемых JCR-170 (и некоторые дополнительные функции, такие как предикаты на этапах определения местоположения). Я не нашел никакой документации о том, какое подмножество XPath поддерживается, кроме примеров. Таким образом, «предок или я» может не поддерживаться. - person LarsH; 16.12.2010
comment
@LarsH, @meltac: это означает, что этот вопрос не относится к тегу xpath-2.0. - person Dimitre Novatchev; 16.12.2010
comment
@Dimitre, я согласен с тем, что похоже, что XPath, поддерживаемый Jackrabbit, не является стандартным XPath (просто подмножеством). Однако ответ на вопрос должен быть стандартным XPath (2.0). - person LarsH; 16.12.2010
comment
@LarsH: Мой ответ - стандартный XPath 2.0. Однако это бесполезно для OP. - person Dimitre Novatchev; 16.12.2010