viz_upload.xts 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--
  3. Licensed Materials - Property of IBM
  4. IBM Cognos Products: ps
  5. (C) Copyright IBM Corp. 2013, 2019
  6. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. -->
  8. <xts:morphlet xmlns:xts="http://developer.cognos.com/schemas/xts/" messageBase="messages/portal.xml, messages/portalRL.xml" resolverBase="prompting" requiredCapability="canUsePortalAdministrationTool">
  9. <xts:block id="getContent" processor="XSLT" type="exec">
  10. <xts:logicsheet path="logicsheets/portal.xsl"/>
  11. <xts:logicsheet path="logicsheets/cm-logic.xsl"/>
  12. <xts:logicsheet path="logicsheets/buslogic.xslt"/>
  13. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  14. xmlns:send="http://developer.cognos.com/schemas/xts/logic-sheet/xslt/brl/1/"
  15. xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt">
  16. <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
  17. <xsl:key name="session-param" match="/root/session/param" use="@name"/>
  18. <xsl:template match="/">
  19. <xsl:variable name="path" select="string(/root/env/param[@name='m_path'])"/>
  20. <xts:sequence>
  21. <xsl:if test="$path != ''">
  22. <xts:append>
  23. <xts:transform src="transforms/CM/post-process.xslt" processor="XSLT">
  24. <send:request provider="cm">
  25. <xts:transform src="transforms/CM/pre-process.xslt" processor="XSLT">
  26. <cm:query xmlns:cm="http://developer.cognos.com/schemas/xts-cm/1/">
  27. <cm:search>~</cm:search>
  28. <cm:properties>
  29. <cm:property name="defaultName"/>
  30. </cm:properties>
  31. </cm:query>
  32. </xts:transform>
  33. </send:request>
  34. </xts:transform>
  35. </xts:append>
  36. </xsl:if>
  37. </xts:sequence>
  38. </xsl:template>
  39. </xsl:stylesheet>
  40. </xts:block>
  41. <xts:block id="format" mode="output" processor="XSLT" type="exec" mimeType="text/html" dependency="getContent">
  42. <xts:logicsheet path="logicsheets/portal.xsl"/>
  43. <xts:logicsheet path="logicsheets/presentation/dialog/templates.xsl"/>
  44. <xts:logicsheet path="logicsheets/presentation/dialog/framework.xsl"/>
  45. <xts:logicsheet path="logicsheets/presentation/layout.xsl"/>
  46. <xts:logicsheet path="logicsheets/presentation/dialog/presentation.xsl"/>
  47. <xts:logicsheet path="logicsheets/presentation/controls/framework.xsl"/>
  48. <xts:logicsheet path="logicsheets/presentation/controls/presentation.xsl"/>
  49. <xts:logicsheet path="logicsheets/formlogic.xslt"/>
  50. <xts:logicsheet path="logicsheets/validation.xslt"/>
  51. <xts:logicsheet path="logicsheets/presentation/touch_up.xslt"/>
  52. <xsl:stylesheet version="1.0"
  53. xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  54. xmlns:pf="http://developer.cognos.com/schemas/xts/pf"
  55. xmlns:cm="http://developer.cognos.com/schemas/xts-cm/1/"
  56. xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt"
  57. xmlns:xts="http://developer.cognos.com/schemas/xts/"
  58. xmlns:crn="http://developer.cognos.com/crconfig/1/"
  59. xmlns:lyt="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/layout/"
  60. xmlns:dp="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/dialog/presentation/"
  61. xmlns:df="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/dialog/framework/"
  62. xmlns:cf="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/controls/framework/"
  63. xmlns:cp="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/controls/presentation/"
  64. xmlns:utml="http://developer.cognos.com/schemas/xts/logicsheet/xslt/formlogic/"
  65. xmlns:dt="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/dialog/templates/"
  66. xmlns:cml="http://developer.cognos.com/schemas/xts/logic-sheet/xslt/cml/1/"
  67. exclude-result-prefixes="xsl cf cp pf df dp lyt cm cml utml xts xtsext">
  68. <xsl:output method="html" version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
  69. <!-- current file name -->
  70. <xsl:variable name="mname" select="'new_general.xts'"/>
  71. <xsl:variable name="promptLocale" select="$productLocale"/>
  72. <xsl:variable name="promptFormName" select="'pform'"/>
  73. <xsl:variable name="skin" select="key('user-param', 'skin')"/>
  74. <pf:variables/>
  75. <!-- variables for modal dialogs -->
  76. <pf:modalVariables/>
  77. <!-- Prompt Control XSL include -->
  78. <xsl:include href="p_include.xsl"/>
  79. <pf:serialize-xml/>
  80. <!-- start the output -->
  81. <xsl:template match="/root">
  82. <xsl:variable name="wizardTitle">
  83. <xts:string id="IDS_IMPORT_VIZ_NEW_VIZ_TITLE"/>
  84. </xsl:variable>
  85. <xsl:variable name="browserTitle">
  86. <xsl:text/>
  87. <xts:string id="IDS_IMPORT_VIZ_SELECT_VIZ_TITLE_NAME_LOCATION">
  88. <xts:param name="wizardTitle">
  89. <xsl:value-of select="$wizardTitle"/>
  90. </xts:param>
  91. </xts:string>
  92. <xsl:text/>
  93. </xsl:variable>
  94. <xsl:variable name="upload-form-url">
  95. <xsl:value-of select="$gateway"/>
  96. <xsl:text/>/vis/gallery<xsl:text/>
  97. <xsl:text/>?maskResponses=true<xsl:text/> <!-- override default vis response to fix iframe load issue -->
  98. </xsl:variable>
  99. <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html></xsl:text><dp:page longTitle="$browserTitle">
  100. <dp:meta>
  101. <!-- Standard meta tags -->
  102. <pf:meta/>
  103. </dp:meta>
  104. <dp:script>
  105. <script language="javascript">
  106. function validate()
  107. {
  108. var f = document.pform;
  109. return true;
  110. }
  111. </script>
  112. <style TYPE="text/css">
  113. .browse-button-link
  114. {
  115. position: absolute;
  116. right: 0; top: 0;
  117. cursor: pointer;
  118. opacity: 0.0000;
  119. filter: alpha(opacity=0);
  120. }
  121. </style>
  122. <script type="text/javascript">
  123. var file_selection_list = [];
  124. var current_file_input_idx = 0;
  125. var current_file_loading_idx = -1;
  126. function acceptsFileExtension(filename) {
  127. var ext = filename.match(/\.([^\.]*)$/)[1];
  128. return (ext == 'zip');
  129. }
  130. function onFileSelection() {
  131. <!-- Update the selection box -->
  132. var updateSelectionDisplayArea = function(fileDisplayName) {
  133. var fileSelectionDiv = document.getElementById("fileSelectionDiv");
  134. <xsl:variable name="hint"><xts:string id="IDS_IMPORT_VIZ_REMOVE_SELECTION_HINT"/></xsl:variable>
  135. fileDisplayName = fileDisplayName.replace(/.*\\/g, "");
  136. var newSelectionEntryHTML = '<div id="selectedFileInput_$pos$" style="margin:1px;">' +
  137. '<span>$filename$<a href="#" onclick="javascript:removeSelection($pos$)"><img style="margin-left:1px" id="deleteimg_$pos$" align="absmiddle" border="0px" src="{$image_root}action_delete.gif" alt="{$hint}" title="{$hint}"/></a></span>' +
  138. '</div>';
  139. newSelectionEntryHTML = newSelectionEntryHTML.replace(/\$pos\$/g, "" + current_file_input_idx).replace(/\$filename\$/g, "" + fileDisplayName);
  140. var newSelectionEntryDiv = document.createElement("div");
  141. fileSelectionDiv.appendChild(newSelectionEntryDiv);
  142. newSelectionEntryDiv.innerHTML = newSelectionEntryHTML;
  143. file_selection_list[current_file_input_idx] = true;
  144. }
  145. <!-- Tuck away the current and create the next file input element -->
  146. var createNextFileInput = function() {
  147. // hide current file input div
  148. var current_fileInputDiv = document.getElementById("fileInputDiv_" + current_file_input_idx);
  149. current_fileInputDiv.style.display = "none";
  150. // create next file input field to accept next selection
  151. current_file_input_idx += 1;
  152. var next_fileInputDiv = document.createElement("div");
  153. next_fileInputDiv.setAttribute("id", "fileInputDiv_" + current_file_input_idx);
  154. current_fileInputDiv.parentNode.appendChild(next_fileInputDiv);
  155. var nextfileinput =
  156. '<span style="position:relative;" id="span_file_input_$pos$">' +
  157. '<input type="file" id="file_input_$pos$" name="file_input_$pos$" accept=".zip" class="browse-button-link" onchange="javascript:onFileSelection()"/>' +
  158. '<span class="formText"><span class="vizImportBrowse"><xts:string id="IDS_IMPORT_VIZ_BROWSE"/></span></span>' +
  159. '</span>';
  160. nextfileinput = nextfileinput.replace(/\$pos\$/g, "" + current_file_input_idx);
  161. next_fileInputDiv.innerHTML = nextfileinput;
  162. }
  163. var fi = document.getElementById("file_input_" + current_file_input_idx);
  164. // Check for acceptable extension
  165. <xsl:if test="false()"> <!-- currently not supported -->
  166. if (!acceptsFileExtension(fi.value)) {
  167. fi.value = "";
  168. alert("Extension unknown!");
  169. return;
  170. }
  171. </xsl:if>
  172. updateSelectionDisplayArea(fi.value);
  173. createNextFileInput();
  174. updateImportButtonState();
  175. }
  176. function removeSelection(entry) {
  177. //delete the entry in the file list
  178. var div = document.getElementById("selectedFileInput_" + entry);
  179. div.parentNode.removeChild(div);
  180. //delete the input field
  181. var fi = document.getElementById("file_input_" + entry);
  182. if (current_file_input_idx > 1) {
  183. fi.parentNode.removeChild(fi);
  184. delete file_selection_list[entry];
  185. } else {
  186. delete file_selection_list[entry];
  187. }
  188. updateImportButtonState();
  189. }
  190. function upload_iframe_onload(response) {
  191. if (current_file_loading_idx == -1) {
  192. return;
  193. }
  194. var uploadingSuccessful = false;
  195. var uploadingDetails = '<xts:string id="IDS_IMPORT_VIZ_IMPORT_ERROR" encode="javascript"/>';
  196. try {
  197. if (response &amp;&amp; response.match(/[^\{]*(\{.*\}).*/)) {
  198. response = response.match(/[^\{]*(\{.*\}).*/)[1];
  199. var response = eval("(" + response + ")");
  200. if (response.Status >= 200 &amp;&amp; response.Status &lt; 300) {
  201. uploadingSuccessful = true;
  202. } else {
  203. uploadingSuccessful = false;
  204. uploadingDetails = response.Description;
  205. }
  206. }
  207. } catch (e) {
  208. // a 500 or 400 http status can wind up here especially with IE access denied error
  209. uploadingSuccessful = false;
  210. }
  211. // update the file's uploading status
  212. if (true) {
  213. var div = document.getElementById("selectedFileInput_" + current_file_loading_idx);
  214. if (div != null) {
  215. var spanstatus = document.createElement("span");
  216. var status = uploadingSuccessful ? '<xts:string id="IDS_IMPORT_VIZ_STATUS_SUCCEEDED" encode="javascript"/>' : '<xts:string id="IDS_IMPORT_VIZ_STATUS_FAILED" encode="javascript"/>';
  217. var span = '<span style="margin-left:5px;">' + status;
  218. if (!uploadingSuccessful) {
  219. span += '<img align="absmiddle" style="margin-left:3px;" border="0px" src="{$image_root}msg_error_8.gif" alt="$hint$" title="$hint$"/>';
  220. span = span.replace(/\$hint\$/g, "" + uploadingDetails);
  221. }
  222. span += '</span>';
  223. spanstatus.innerHTML = span;
  224. div.appendChild(spanstatus);
  225. }
  226. }
  227. doUpload();
  228. updateImportButtonState();
  229. }
  230. function getFileSelectionListSize() {
  231. var s = 0;
  232. for (var k in file_selection_list) {
  233. s++;
  234. }
  235. return s;
  236. }
  237. function updateImportButtonState() {
  238. var id_uploadText = document.getElementById("id_uploadText");
  239. if (getFileSelectionListSize() == 0) {
  240. id_uploadText.className = "commandButtonInactive";
  241. id_uploadText.onmouseover = function() { return false; }
  242. id_uploadText.onmouseout = function() { return false; }
  243. id_uploadText.onmousedown = function() { return false; }
  244. } else {
  245. id_uploadText.className = "commandButton";
  246. id_uploadText.onmouseover = function() { this.className="commandButtonOver"; }
  247. id_uploadText.onmouseout = function() { this.className="commandButton"; }
  248. id_uploadText.onmousedown = function() { this.className="commandButtonDown"; }
  249. }
  250. }
  251. function setReplaceWarningVisibility(isVisible) {
  252. var warn = document.getElementById("id_replaceExistingWarning");
  253. if(isVisible) {
  254. warn.style.visibility="visible";
  255. } else {
  256. warn.style.visibility="hidden";
  257. }
  258. }
  259. function doUpload() {
  260. if (getFileSelectionListSize() == 0) {
  261. return;
  262. }
  263. try {
  264. for (var i in file_selection_list) {
  265. var url = "<xsl:value-of select="$upload-form-url"/>";
  266. var upload_form = document.upload_form;
  267. var replaceEntries = document.pform.id_replaceCheckbox.checked;
  268. if(replaceEntries) {
  269. url += "&amp;updateAction=UPDATE";
  270. } else {
  271. url += "&amp;updateAction=FAIL";
  272. }
  273. var fi = document.getElementById("file_input_" + i);
  274. if (fi) {
  275. current_file_loading_idx = i;
  276. upload_form.appendChild(fi);
  277. var xmlhttp = new XMLHttpRequest();
  278. xmlhttp.onreadystatechange = function() {
  279. if (this.readyState === 4) {
  280. upload_iframe_onload(this.responseText);
  281. }
  282. }
  283. xmlhttp.open("POST", url, true);
  284. var xsrf_token_value = "<xsl:value-of select="xtsext:javascriptencode(string(/root/cookies/cookie[@name='XSRF-TOKEN']))"/>";
  285. xmlhttp.setRequestHeader("X-XSRF-TOKEN", xsrf_token_value);
  286. xmlhttp.send(new FormData(upload_form));
  287. fi.parentNode.removeChild(fi);
  288. delete file_selection_list[i];
  289. var div = document.getElementById("selectedFileInput_" + i);
  290. div.className = "vizImportListInactiveEntry";
  291. var deleteimg = document.getElementById("deleteimg_" + i);
  292. deleteimg.parentNode.removeChild(deleteimg);
  293. return;
  294. }
  295. }
  296. } catch (e) {
  297. alert(e);
  298. }
  299. updateImportButtonState();
  300. }
  301. function doClose() {
  302. if (getFileSelectionListSize() > 0) {
  303. if (confirm('<xts:string id="IDS_IMPORT_VIZ_DISCARD_SELECTION" encode="javascript"/>')) {
  304. location.href = "<xsl:value-of select="xtsext:javascriptencode(string(/root/env/param[@name='backURL']))"/>";
  305. }
  306. } else {
  307. location.href = "<xsl:value-of select="xtsext:javascriptencode(string(/root/env/param[@name='backURL']))"/>";
  308. }
  309. }
  310. </script>
  311. <script language="javascript" src="{$webcontent}/{$app}/js/utilities.js"/>
  312. <!-- Help system -->
  313. <pf:help context="HID_IMPORT_VISUALIZATION"/>
  314. </dp:script>
  315. <!-- ================================================================ -->
  316. <!-- H E A D E R -->
  317. <!-- ================================================================ -->
  318. <dp:header>
  319. <dp:title>
  320. <xsl:value-of select="$browserTitle"/>
  321. </dp:title>
  322. <dp:description>
  323. <xts:string id="IDS_IMPORT_VIZ_NEW_VIZ_INTRO"/>
  324. </dp:description>
  325. <dp:close>
  326. <span id="xbuttonClose" style="position: absolute;margin-top: -9999px; "><xts:string id="IDS_CLOSE"/></span>
  327. <xsl:choose>
  328. <xsl:when test="$isModal">
  329. <a href="javascript:processModalCommand('close')" aria-labelledby="xbuttonClose">
  330. <dp:closeMarker/>
  331. </a>
  332. </xsl:when>
  333. <xsl:otherwise>
  334. <a href="{/root/env/param[@name = 'backURL']}">
  335. <xsl:attribute name="onClick">javascript:resetPageState()</xsl:attribute>
  336. <xsl:attribute name="aria-labelledby">xbuttonClose</xsl:attribute>
  337. <dp:closeMarker/>
  338. </a>
  339. </xsl:otherwise>
  340. </xsl:choose>
  341. </dp:close>
  342. </dp:header>
  343. <iframe src="about:blank" id="upload_iframe" name="upload_iframe" style="position:absolute;left:-999px;top:-999px" onload="javascript:upload_iframe_onload()"></iframe>
  344. <lyt:layout style="1">
  345. <lyt:section>
  346. <dp:list>
  347. <dp:section>
  348. <div style="margin:10px;">
  349. <form style="margin-top:5px" name="pform" method="post"
  350. enctype="multipart/form-data"
  351. action="">
  352. <table cellpadding="0" cellspacing="0">
  353. <!-- browse button -->
  354. <tr>
  355. <td class="formLabel"><xts:string id="IDS_IMPORT_VIZ_SELECTED_VISUALIZATIONS"/></td>
  356. <td align="right">
  357. <div id="fileInputDiv_0">
  358. <span style="position:relative;" id="span_file_input_0">
  359. <input type="file" id="file_input_0" name="file_input_0" accept=".zip" class="browse-button-link" onchange="javascript:onFileSelection()"/>
  360. <span class="formText"><span class="vizImportBrowse"><xts:string id="IDS_IMPORT_VIZ_BROWSE"/></span></span>
  361. </span>
  362. </div>
  363. </td>
  364. </tr>
  365. <!-- selection display area -->
  366. <tr>
  367. <td colspan="2">
  368. <div style="margin-left:10px;margin-top:10px">
  369. <div id="fileSelectionDiv" class="vizImportList">
  370. </div>
  371. </div>
  372. </td>
  373. </tr>
  374. <tr>
  375. <td>
  376. <img height="12" width="1" border="0" src="{concat($webcontent, '/images/space.gif')}"/>
  377. </td>
  378. </tr>
  379. <!-- import button -->
  380. <tr>
  381. <td colspan="2" align="right">
  382. <a id="id_uploadAnchor" href="#" onclick="javascript:doUpload()">
  383. <table border="0" cellpadding="0" cellspacing="0">
  384. <tr>
  385. <td>
  386. <span id="id_uploadText" class="commandButtonInactive">
  387. <xsl:attribute name="style">padding-right:10px; padding-left:10px; padding-top:2px; padding-bottom:3px;</xsl:attribute>
  388. <xts:string id="IDS_IMPORT_VIZ_IMPORT"/>
  389. </span>
  390. </td>
  391. </tr>
  392. </table>
  393. </a>
  394. </td>
  395. </tr>
  396. </table>
  397. <img height="12" width="1" border="0" src="{concat($webcontent, '/images/space.gif')}" />
  398. <table cellpadding="0" cellspacing="2">
  399. <!-- replace existing checkbox -->
  400. <tr>
  401. <td colspan="2" >
  402. <span class="formText"><xts:string id="IDS_IMPORT_VIZ_REPLACE_WARNING"/></span>
  403. </td>
  404. </tr>
  405. <!-- replace existing checkbox -->
  406. <tr>
  407. <td width="1">
  408. <input type="checkbox" name="id_replaceCheckbox" id="id_replaceCheckbox"
  409. onclick="javascript:setReplaceWarningVisibility(document.pform.id_replaceCheckbox.checked)"/>
  410. </td>
  411. <td class="formText" >
  412. <label for="id_replaceCheckbox">
  413. <xts:string id="IDS_IMPORT_VIZ_REPLACE"/>
  414. </label>
  415. </td>
  416. </tr>
  417. <!-- replace warning -->
  418. <tr>
  419. <td colspan="2">
  420. <div id="id_replaceExistingWarning" style="visibility: hidden;">
  421. <table border="0" cellpadding="1" cellspacing="0">
  422. <tr>
  423. <td>
  424. <img border="0" height="16" width="16" src="{concat($webcontent, '/', $app, '/images/msg_warning_16.gif')}">
  425. <xsl:attribute name="alt"><xts:string id="IDS_STATUS_WARN" encode="html"/></xsl:attribute>
  426. </img>
  427. </td>
  428. <td>
  429. <img height="12" width="1" border="0" src="{concat($webcontent, '/images/space.gif')}" />
  430. </td>
  431. <td>
  432. <span class="formText"><xts:string id="IDS_IMPORT_VIZ_REPLACE_WARNING_DETAIL"/></span>
  433. </td>
  434. </tr>
  435. </table>
  436. </div>
  437. </td>
  438. </tr>
  439. </table>
  440. </form>
  441. </div>
  442. <form name="upload_form" method="post" enctype="multipart/form-data" action="" target="upload_iframe"></form>
  443. </dp:section>
  444. </dp:list>
  445. </lyt:section>
  446. </lyt:layout>
  447. <!-- ================================================================ -->
  448. <!-- F O O T E R -->
  449. <!-- ================================================================ -->
  450. <dp:footer>
  451. <df:button df:id="IDS_CLOSE" df:style="href" df:href="#" onclick="doClose(event);"/>
  452. </dp:footer>
  453. </dp:page>
  454. </xsl:template>
  455. </xsl:stylesheet>
  456. </xts:block>
  457. <!-- Debug -->
  458. <!-- ============================================================================= -->
  459. <xts:block id="debug" dependency="format" condition=".[ /root/session/param[@name='debug'] = '1' ]" type="exec" mode="output" processor="XSLT" mandatory="false" mimeType="text/html">
  460. <xts:logicsheet path="logicsheets/debuglogic.xslt"/>
  461. <!-- debug logic sheet -->
  462. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dbg="http://developer.cognos.com/schemas/xts/logicsheets/xslt/debug/" exclude-result-prefixes="dbg">
  463. <xsl:output method="html" version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
  464. <xsl:template match="/">
  465. <dbg:dumpxml select="/root"/>
  466. </xsl:template>
  467. </xsl:stylesheet>
  468. </xts:block>
  469. </xts:morphlet>