CQ从当前节点(当前组件)访问深子节点的属性

sef*_*osu 3 jsp components jcr sling aem

我正在研究一个名为"tabbedcarousel"的轮播组件,我需要遍历它的子节点来访问图像属性.见下图:

在此输入图像描述

那个"tabbedimagecarouselunselectedimage" - >"fileReference"是我需要得到的.

说我目前在"tabbedcarousel.jsp"上工作,我可以访问我的currentNode,所以我假设得到深子img属性的方式是这样的:

<%


        NodeIterator tabbedCarouselChildNodes = currentNode.getNodes();
        while(tabbedCarouselChildNodes.hasNext()){
            Node parNode = tabbedCarouselChildNodes.nextNode();

            NodeIterator parChildNodes = parNode.getNodes();
            while(parChildNodes.hasNext()){
                Node tabbedCarouselItemNode = parChildNodes.nextNode();

                NodeIterator tabbedCarouselItemChildNodes = tabbedCarouselItemNode.getNodes();
                while(tabbedCarouselItemChildNodes.hasNext()){
                    Node tabImgNode = tabbedCarouselItemChildNodes.nextNode();
                    %>
                    test here s the img property : <%= tabImgNode.getProperties("fileReference").toString()%> !!!
                    <% 
            }
        }

%>
Run Code Online (Sandbox Code Playgroud)

但它不起作用.希望有人可以给我一些建议.谢谢

Tom*_*wek 8

我在最后添加了一个大括号并替换tabImgNode.getProperties()hasProperty()/ getProperty()combo.我的CQ工作正常:

<%
NodeIterator tabbedCarouselChildNodes = currentNode.getNodes();
while(tabbedCarouselChildNodes.hasNext()) {
    Node parNode = tabbedCarouselChildNodes.nextNode();
    NodeIterator parChildNodes = parNode.getNodes();
    while(parChildNodes.hasNext()){
        Node tabbedCarouselItemNode = parChildNodes.nextNode();
        NodeIterator tabbedCarouselItemChildNodes = tabbedCarouselItemNode.getNodes();
        while(tabbedCarouselItemChildNodes.hasNext()){
            Node tabImgNode = tabbedCarouselItemChildNodes.nextNode();
            if (!tabImgNode.hasProperty("fileReference")) {
                continue;
            }
%>
test: <%= tabImgNode.getProperty("fileReference").getString()%>
<% 
        }
    }
}
%>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,它可以使用Sling API重构:

<%
Iterator<Resource> items = resource.getChild("par").listChildren();
while (items.hasNext()) {
    Resource property = items.next().getChild("tabimageunselectedimage/fileReference");
    if (property == null) {
        continue;
    }
%>
fileReference: <%= property.adaptTo(String.class) %>
<% } %>
Run Code Online (Sandbox Code Playgroud)

第三种选择是使用名为SlingQuery的第三方库:

<% for (Resource r : SlingQuery.$(resource).find("#tabimageunselectedimage")) { %>
  path: <%= r.adaptTo(ValueMap.class).get("fileReference") %>
<% } %>
Run Code Online (Sandbox Code Playgroud)