S'ha produït un error mentre es processava la plantilla.
The following has evaluated to null or missing:
==> root.selectSingleNode("dynamic-element[@name='" + name + "']/dynamic-content")  [in template "10901#10934#AGENDA" at line 98, column 18]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #local node = root.selectSingleNode("...  [in template "10901#10934#AGENDA" in function "nodeText" at line 98, column 3]
----
1<#-- [I] Services & utils --> 
2 
3  <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
4  <#assign friendlyURLNormalizer=staticUtil["com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil"]> 
5  <#assign groupUtil = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")> 
6  <#assign assetEntryService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")> 
7  <#assign assetCategoryService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")> 
8  <#assign assetCategoryPropertyLocalService=serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService" )> 
9 
10<#-- [F] Services --> 
11<#-- [I] Variables globals --> 
12 
13    <#assign geniusGroupId=6200569> 
14    <#assign id = .vars['reserved-article-id'].data> 
15    <#assign group=groupUtil.getGroup(groupId)> 
16    <#assign articles = journalArticleLocalService.getStructureArticles(groupId, 341449, 0, 1, null)> 
17    <#-- MIGRATION FIX: el fallback de bibliobús ara s'assigna a "articles" (abans anava a "articlesBibliobus", que mai s'utilitzava -> crida a servei malbaratada) --> 
18    <#if !articles?has_content> 
19      <#assign articles = journalArticleLocalService.getStructureArticles(groupId, 437558715, 0, 1, null)> 
20    </#if> 
21    <#assign journalArticle = journalArticleLocalService.getArticle(groupId, id)> 
22    <#assign assetEntry = assetEntryService.getEntry("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey())> 
23    <#assign categorias=assetCategoryService.getEntryCategories(assetEntry.getEntryId())> 
24    <#assign themedisplayscopeid=themeDisplay.getScopeGroupId()> 
25 
26<#-- [F] Variables globals --> 
27<#-- [I] IDs categories --> 
28 
29<#assign 
30    idTipusAct = 57984278 
31    idTipusPublic = 57984246 
32    idPeriodicitat = 64158317 
33    idDiesSetmana = 64158372 
34    idBibliolab = 341097 
35    idODS = 429525132 
36  /> 
37 
38<#-- [F] IDs categories --> 
39<#-- [I] Macros reutilitzables --> 
40 
41<#macro formatDate dateString> 
42  <#if validator.isNotNull(dateString)> 
43    <#assign dateObj = dateUtil.parseDate("yyyy-MM-dd", dateString, locale)> 
44    ${dateUtil.getDate(dateObj, "dd/MM/yyyy", locale)} 
45  </#if> 
46</#macro> 
47 
48<#macro getDataString> 
49  <#assign Data_Inici_Data = getterUtil.getString(Data_Inici.getData())> 
50  <#assign Data_Fi_Data = getterUtil.getString(Data_Fi.getData())> 
51 
52  <#if (Data_Inici.getData() ==Data_Fi.getData())> 
53      <@formatDate dateString=Data_Inici_Data /> 
54  <#else > 
55      <@formatDate dateString=Data_Inici_Data /> - <@formatDate dateString=Data_Fi_Data /> 
56  </#if> 
57</#macro> 
58 
59<#macro renderImage> 
60  <#-- MIGRATION FIX: null-safety amb (...)!"" i ?has_content en tots els accessos a camps --> 
61  <#assign imagenURL = (imatge.getData())!""> 
62  <#if imagenURL?length == 0> 
63    <#assign imagenURL = (imatge.urlExterna.getData())!""> 
64  </#if> 
65  <#if imagenURL?has_content> 
66    <#assign descShort = stringUtil.shorten(htmlUtil.stripHtml((descripcio.getData())!""), 350)> 
67    <#assign titolMeta = (titol.getData())!""> 
68    <#assign peu = (peuImatge.getData())!""> 
69    <div class="flotantesquerra" style="max-width:200px"> 
70      <#if imagenURL?length gte 4 && imagenURL?substring(0,4) != "http"> 
71        <#assign imagenURL = themeDisplay.getPortalURL() + imagenURL> 
72      </#if> 
73      <meta property="og:url" content="${themeDisplay.getPortalURL()}${themeDisplay.getURLCurrent()}"/> 
74      <meta property="og:type" content="article" /> 
75      <meta property="og:description" content="${descShort}" /> 
76      <meta property="og:title" content="${titolMeta}" /> 
77      <meta property="og:image" content="${imagenURL}" /> 
78      <meta property="og:image:width" content="250" /> 
79      <meta property="og:image:height" content="200" /> 
80      <meta name="twitter:card" content="summary_large_image" /> 
81      <meta name="twitter:card" content="summary" /> 
82      <meta name="twitter:title" content="${titolMeta}" /> 
83      <meta name="twitter:description" content="${descShort}" /> 
84      <meta name="twitter:url" content="${themeDisplay.getPortalURL()}${themeDisplay.getURLCurrent()}"/> 
85      <meta name="twitter:image" content="${imagenURL}" /> 
86 
87      <img alt="" src="${imagenURL}" style="max-width:200px"/> 
88      <#if peu?has_content> 
89        <span> ${peu}</span> 
90      </#if> 
91    </div> 
92  </#if> 
93</#macro> 
94 
95<#-- MIGRATION FIX: substitueix saxReaderUtil + selectSingleNode().getText() per un accés null-safe 
96     al document ja carregat de l'article (art.getDocument()), sense servei extern de parsing XML --> 
97<#function nodeText root name> 
98  <#local node = root.selectSingleNode("dynamic-element[@name='" + name + "']/dynamic-content")> 
99  <#if node?? && node?has_content> 
100    <#return (node.getText())!""> 
101  </#if> 
102  <#return ""> 
103</#function> 
104 
105<#macro printODS categories> 
106  <#if validator.isNotNull(categories)> 
107	<#assign additionalCssClass="" /> 
108	<#if (getterUtil.getInteger(themedisplayscopeid) == getterUtil.getInteger(geniusGroupId))> 
109	    <#assign additionalCssClass="genius" /> 
110	</#if> 
111    <div class="row seccionOds ${additionalCssClass}"> 
112      <div class="col-fluid"> 
113        <a id="titolOds" class="btn" data-toggle="collapse" href="#categoryOds" role="button" aria-expanded="true" aria-controls="collapseExample" title="ODS"> 
114            <img src="/documents/d/global/icona-objectius-globals"/> 
115            <i class="icon-large fa-solid fa-chevron-right"/> 
116        </a> 
117      </div> 
118      <div class="col collapse show" id="categoryOds"> 
119        <#list categories as categoria> 
120          <#--ODS--> 
121          <#if (categoria.getVocabularyId()==idODS)> 
122            <#-- MIGRATION FIX: variables locals (odsImatge/odsUrl) per no sobreescriure el camp global "imatge"; src amb cometes --> 
123            <#local odsImatge = assetCategoryPropertyLocalService.getCategoryProperty(categoria.getCategoryId(), "imatge")> 
124            <#local odsUrl = assetCategoryPropertyLocalService.getCategoryProperty(categoria.getCategoryId(), "url")> 
125            <#if odsImatge?has_content && odsUrl?has_content> 
126                <a href="${odsUrl.getValue()}" title="${categoria.getName()}" target="_blank"> 
127                    <img src="${odsImatge.getValue()}" alt="${categoria.getName()}" class="mb-2"> 
128                </a> 
129            </#if> 
130          </#if> 
131        </#list> 
132      </div> 
133    </div> 
134  </#if> 
135</#macro> 
136 
137 
138<#-- [F] Macros reutilitzables --> 
139<#-- [I] Valors categories --> 
140  <#-- MIGRATION FIX: substituïm concatenacions de strings per llistes + ?join (més segur i llegible) --> 
141  <#assign tipusActivitatList = []> 
142  <#assign tipusPublicList = []> 
143  <#assign periodicitatList = []> 
144  <#assign diesList = []> 
145  <#assign bibliolab = ""> 
146  <#assign hasOds = false> 
147 
148  <#list categorias as categoria> 
149    <#assign vocabId = categoria.getVocabularyId()> 
150    <#assign titolCat = categoria.getTitle(locale, true)> 
151    <#if vocabId == idTipusAct> 
152      <#assign tipusActivitatList = tipusActivitatList + [titolCat]> 
153    <#elseif vocabId == idTipusPublic> 
154      <#assign tipusPublicList = tipusPublicList + [titolCat]> 
155    <#elseif vocabId == idPeriodicitat> 
156      <#assign periodicitatList = periodicitatList + [titolCat]> 
157    <#elseif vocabId == idDiesSetmana> 
158      <#assign diesList = diesList + [titolCat]> 
159    <#elseif vocabId == idBibliolab> 
160      <#if titolCat == "BiblioLab"> 
161        <#assign bibliolab = "1"> 
162      </#if> 
163    <#elseif vocabId == idODS> 
164      <#assign hasOds = true> 
165    </#if> 
166  </#list> 
167 
168  <#assign tipusActivitat = tipusActivitatList?join(" | ")> 
169  <#assign tipusPublic = tipusPublicList?join(" | ")> 
170  <#assign periodicitat = periodicitatList?join(",")> 
171  <#assign dies = diesList?join(", ")> 
172  <#-- MIGRATION FIX: eliminat el reset final de "bibliolab" que anul·lava el logo BiblioLab (bug) i les variables ...Biblio no utilitzades --> 
173<#-- [F] Valors categories --> 
174 
175<#if (getterUtil.getInteger(themedisplayscopeid) != getterUtil.getInteger(geniusGroupId))> 
176  <h2 class="titol"><@liferay.language key="activities"/></h2> 
177</#if> 
178<div class="detalleEvento" style="clear:both">  
179  <div class="seccionTitulo"> 
180    <div class="titulo" style="float:left !important; margin-left:5px; width: calc(100% - 5px);"> 
181      <span style="float:left !important; margin-left:5px">${(titol.getData())!""}</span> 
182      <#if bibliolab == "1"> 
183        <div class="logoBiblioLab" style="float:right !important; margin-left:5px"></div> 
184      </#if> 
185    </div> 
186  </div> 
187  <#if ((imatge.getData())!"")?has_content> 
188    <@renderImage/> 
189  </#if> 
190  ${(descripcio.getData())!""} 
191  <div class="seccionDatos"> 
192    <div class="fechaHora"> 
193      <div class="fecha"> 
194        <@liferay.language key="date"/> 
195      </div> 
196      <div class="datoFecha"> 
197        <@getDataString/> 
198        <#if periodicitat?has_content> 
199          <br/><@liferay.language key="periodicidad"/>: ${periodicitat} 
200          <#if dies?has_content> 
201            <br/><@liferay.language key="periodicidad.texto.dias"/>: ${dies} 
202          </#if> 
203        </#if> 
204      </div> 
205      <div class="fecha"> 
206        <@liferay.language key="time"/> 
207      </div> 
208      <#assign horaIniciText = (horaInici.getData())!""> 
209      <#if horaIniciText?has_content> 
210        <div class="datoFecha"> 
211         ${horaIniciText} 
212        </div> 
213      </#if> 
214      <#assign duracioText = (duracio.getData())!""> 
215      <#if duracioText?has_content> 
216        <div class="fecha"> 
217          <@liferay.language key="agenda.duracio"/> 
218        </div>     
219        <div class="datoFecha"> 
220          ${duracioText} 
221        </div>    
222      </#if> 
223      <#if tipusPublic?has_content> 
224        <div class="fecha"> 
225          <@liferay.language key="agenda.tipuspublic"/> 
226        </div> 
227        <div class="datoFecha"> 
228          ${tipusPublic} 
229        </div> 
230      </#if> 
231    </div> 
232    <div class="lugares"> 
233      <div class="lugar"> 
234        <@liferay.language key="place"/> 
235      </div> 
236      <div class="lugarEvento"> 
237        <#-- MIGRATION FIX: sense saxReaderUtil; s'usa art.getDocument() (document ja parsejat i cachejat per l'article) + funció nodeText null-safe --> 
238        <#assign biblioName = (group.getDescriptiveName())!""> 
239        <#assign biblioUrl = friendlyURLNormalizer.normalize(biblioName)?replace(".", "")?replace("-–-", "-")> 
240        <#assign lang = languageUtil.getLanguageId(locale)> 
241        <#if articles?has_content> 
242          <#list articles as art> 
243            <#assign doc = art.getDocument()!> 
244            <#assign latitudBiblio = ""> 
245            <#assign longitudBiblio = ""> 
246            <#assign adressBiblio = ""> 
247            <#assign phoneBiblio = ""> 
248            <#assign emailBiblio = ""> 
249            <#if doc?? && doc?has_content> 
250              <#assign root = doc.getRootElement()> 
251              <#assign latitudBiblio = nodeText(root, "latitude")> 
252              <#assign longitudBiblio = nodeText(root, "longitude")> 
253              <#assign adressBiblio = nodeText(root, "address")> 
254              <#assign phoneBiblio = nodeText(root, "phone")> 
255              <#assign emailBiblio = nodeText(root, "email")> 
256            </#if> 
257            <#-- Els camps latitud/longitud de la pròpia activitat tenen prioritat --> 
258            <#if ((latitud.getData())!"")?has_content> 
259              <#assign latitudBiblio = latitud.getData()?trim> 
260            </#if> 
261            <#if ((longitud.getData())!"")?has_content> 
262              <#assign longitudBiblio = longitud.getData()?trim> 
263            </#if> 
264 
265            <strong><a href="/${biblioUrl}">${biblioName}</a></strong> 
266            <#if latitudBiblio?has_content && longitudBiblio?has_content> 
267              <br/><a href="https://www.google.es/maps/place/${latitudBiblio},${longitudBiblio}?hl=${lang?substring(0,2)}" target="_blank">${languageUtil.get(locale, 'agenda.indicacions')}</a> 
268            </#if> 
269            <#if adressBiblio?has_content><br/>${adressBiblio}</#if> 
270            <#if phoneBiblio?has_content> 
271            Tel: ${phoneBiblio} 
272            </#if> 
273            <#if emailBiblio?has_content> 
274            <br/><a href="mailto:${emailBiblio}">${emailBiblio}</a> 
275            </#if> 
276          </#list> 
277        <#else> 
278          <a href="/${biblioUrl}">${biblioName}</a> 
279        </#if> 
280      </div> 
281      <#assign preuText = (preu.getData())!""> 
282      <#if preuText?has_content> 
283        <div class="lugar"> 
284          <@liferay.language key="price"/> 
285        </div> 
286        <div class="lugarEvento"> 
287          ${preuText} 
288        </div> 
289      </#if> 
290      <#if tipusActivitat?has_content> 
291        <div class="lugar"> 
292          <@liferay.language key="agenda.tipusactivitat"/> 
293        </div> 
294        <div class="lugarEvento"> 
295          ${tipusActivitat} 
296        </div> 
297      </#if> 
298      <#if urlInscripcions?? && (urlInscripcions.getData())?has_content> 
299        <a href="${urlInscripcions.getData()}" target="_blank" class="btn btn-default"> 
300          <@liferay.language key="agenda.inscriurem"/> 
301        </a> 
302      </#if> 
303    </div> 
304  </div> 
305  <#if hasOds> 
306    <#-- TODO: Moure estils al tema --> 
307    <style> 
308      #titolOds img, #categoryOds img { 
309        height: 3.5rem; 
310        margin: 0px 5px; 
311
312      .seccionOds { 
313        margin: 0 0 20px 0; 
314        display: inline-flex; 
315
316      .seccionOds a { 
317        text-decoration: none; 
318
319      #categoryOds img { 
320        margin-top: 0.375rem; 
321
322    </style> 
323    <@printODS categorias/> 
324  </#if> 
325</div> 
326 
327<#-- [I] Add to any --> 
328<div style="clear:both"></div> 
329<div class="a2a_kit a2a_kit_size_32 a2a_default_style" data-a2a-url="${themeDisplay.getPortalURL()}${themeDisplay.getURLCurrent()}" data-a2a-title="${(titol.getData())!""}" style="background-color: #e6e6e6;display: inline-block;" data-a2a-icon-color="#e6e6e6,#000000"> 
330  <div class="a2a_kit a2a_kit_size_32 a2a_default_style"> 
331    <a class="a2a_dd" href="https://www.addtoany.com/share"></a> 
332    <a class="a2a_button_email"></a> 
333    <a class="a2a_button_print"></a> 
334  </div> 
335</div> 
336<div style="clear:both"></div> 
337<script> 
338	var a2a_config = a2a_config || {}; 
339	a2a_config.onclick = false; 
340	a2a_config.locale = "es"; 
341 
342	/* MIGRATION FIX: eliminat jQuery ($(document).ready) -> DOMContentLoaded natiu */ 
343	document.addEventListener('DOMContentLoaded', function () { 
344		try { 
345			var script = document.createElement('script'); 
346			script.src = "https://static.addtoany.com/menu/page.js"; 
347			script.addEventListener('load', function () { 
348				try { 
349					a2a.init_all(); 
350				} catch (error) { 
351					console.error(error.message); 
352
353			}); 
354			document.head.appendChild(script); 
355		} catch (error) { 
356			console.error(error.message); 
357
358	}); 
359</script>