2016-10-24 3 views
0

Возможно ли найти одноименных братьев и сестер (SNS) с использованием SQL2, SQL, XPath или QueryBuilder в Adobe CQ5/Adobe Experience Менеджер. Мы пытаемся подготовить экземпляр для обновления до AEM 6.X, и поскольку уже известный дуб из джейбрабита отключил поддержку SNS, что делает обновление без решения этой проблемы невозможным. Репозиторий может проходить рекурсивно, но это слишком медленно, и я ищу лучшие варианты с помощью запросов. SNS определяются следующим образом:Найти одноименных братьев и сестер (SNS) с использованием запросов SQL2, SQL, XPath или QueryBuilder в CQ5/AEM

/a/b/c 
/a/b/c[2] 
/a/b/c[3] 

/a/b[2]/c[2] 
/a/b/c[3] 

Я бы предпочел SQL2, но возможен и другой вариант. Обратите внимание, что никакие функции или xslt не возможны, потому что мы говорим не о XML-документах, а о репозитории java-содержимого (JCR).

+0

Пожалуйста, точнее о ваших требований. Например, вы ищете одноименных братьев или сестер определенного элемента или для всех наборов одноименных братьев и сестер во всем документе? –

+0

Спасибо за ваш комментарий. Я говорю о CQ5/AEM. Эти теги также задаются в вопросе. Это известная проблема, поэтому я не видел необходимости быть более точным, так как это должно быть достаточно ясно для людей, работающих с системой. Поскольку вы явно не понимали, в чем суть требований, я нахожу ваш комментарий здесь и запрос на улучшение в порядке, но ваш ответ ниже и ваш downvote не подходят. В любом случае, спасибо за ваше время! – d33t

ответ

1

В XQuery 1.0 или XPath 3.0 одноименных братьев контекстного узла может быть найден как

let $n := node-name(.) 
return (preceding-sibling::* | following-sibling::*)[node-name(.) = $n] 

или как

let $n := node-name(.) 
return ../*[node-name(.) = $n] except . 

(далее «за исключением.» Может быть опущено, если вам хотите включить исходный элемент в результат).

Я не думаю, что чистый раствор XPath 1,0 возможно, из-за отсутствия переменных диапазона, но с XPath 1.0 в XSLT 1.0 вы можете сделать

(preceding-sibling::* | following-sibling::*) 
[local-name(.) = local-name(current()) and 
    namespace-uri(.) = namespace-uri(current())] 
Смежные вопросы