properties_members.xts 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969
  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. 2005, 2014
  6. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. -->
  8. <!--
  9. Copyright (C) 2008 Cognos ULC, an IBM Company. All rights reserved.
  10. Cognos (R) is a trademark of Cognos ULC, (formerly Cognos Incorporated).
  11. -->
  12. <xts:morphlet xmlns:xts="http://developer.cognos.com/schemas/xts/" messageBase="messages/portal.xml, messages/portalRL.xml" requiredCapability="canUseAdministrationPortal">
  13. <xts:block id="formlogic_init" type="exec" mode="interpret" processor="XSLT" path="/logicsheets/formlogic_init.xslt" nodelist="env,credential,system,http"/>
  14. <!-- Load object-specific property tabs map ============================================================== -->
  15. <xts:block id="getTabs" type="exec" mode="interpret" processor="XML" path="/portal/uiobjects_tabs.xml"/>
  16. <!--
  17. ===============================================================================================
  18. callMorphlet - Calls the appropriate morphlet using the passed in params which will return
  19. markup to be displayed or the expected results
  20. ===============================================================================================
  21. -->
  22. <xts:block
  23. id="callMorphlet"
  24. nodelist="requestParams,env, http, session, credential, cookies, header, user"
  25. processor="XSLT"
  26. type="exec"
  27. condition=".[ /root/env/param[@name='controller_state'] != '' ]"
  28. mandatory="false">
  29. <xts:logicsheet path="logicsheets/portal.xsl"/>
  30. <xts:logicsheet path="logicsheets/presentation/dialog/controller-templates.xsl"/>
  31. <xsl:stylesheet version="1.0"
  32. xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  33. xmlns:dlgctrl="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/dialog/controller-templates/"
  34. xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt"
  35. xmlns:req-params="http://developer.cognos.com/schemas/request/params"
  36. exclude-result-prefixes="xsl dlgctrl xtsext req-params">
  37. <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
  38. <xsl:key name="env-param" match="/root/env/param" use="@name"/>
  39. <xsl:variable name="object-class">
  40. <xsl:choose>
  41. <xsl:when test="key('env-param','m_new_class') != ''">
  42. <xsl:value-of select="key('env-param','m_new_class')"/>
  43. </xsl:when>
  44. <xsl:otherwise>
  45. <xsl:value-of select="key('env-param','m_class')"/>
  46. </xsl:otherwise>
  47. </xsl:choose>
  48. </xsl:variable>
  49. <xsl:template match="/">
  50. <xts:sequence>
  51. <dlgctrl:XTS2Request>
  52. <dlgctrl:target>/portal/addEntries/add_entries.xts</dlgctrl:target>
  53. <dlgctrl:stackName>addEntriesStack</dlgctrl:stackName>
  54. <req-params:param name="defaultTarget">/portal/properties_members.xts</req-params:param>
  55. <req-params:param name="titlePostfix">
  56. <xsl:choose>
  57. <xsl:when test="key('env-param','m_new_class')='group'">
  58. <xts:string id="IDS_ADDENTRIES_TITLE_NEW_GROUP"/>
  59. </xsl:when>
  60. <xsl:when test="key('env-param','m_new_class')='role'">
  61. <xts:string id="IDS_ADDENTRIES_TITLE_NEW_ROLE"/>
  62. </xsl:when>
  63. <xsl:when test="key('env-param','m_new_class')='distributionList'">
  64. <xts:string id="IDS_ADDENTRIES_TITLE_NEW_DISTRIBUTION_LIST"/>
  65. </xsl:when>
  66. <xsl:otherwise>
  67. <xsl:value-of select="key('env-param','m_name')"/>
  68. </xsl:otherwise>
  69. </xsl:choose>
  70. </req-params:param>
  71. <req-params:param name="defaultSearchPath">
  72. <xsl:text>/directory</xsl:text>
  73. <xsl:if test="key('env-param','m_class')='tenant'">
  74. <xsl:text>/tenants</xsl:text>
  75. </xsl:if>
  76. </req-params:param>
  77. <req-params:param name="showUsers"><xsl:value-of select="key('env-param','m_class')!='tenant'"/></req-params:param>
  78. <req-params:param name="typeDialog"><xsl:value-of select="key('env-param','m_class')!='tenant'"/></req-params:param>
  79. <req-params:param name="addEntriesUI">
  80. <xsl:choose>
  81. <xsl:when test="$object-class = 'distributionList'">
  82. <xsl:value-of select="'recipients_distribution'"/>
  83. </xsl:when>
  84. <xsl:when test="$object-class = 'group'">
  85. <xsl:value-of select="'groupMembers'"/>
  86. </xsl:when>
  87. <xsl:when test="$object-class = 'role'">
  88. <xsl:value-of select="'members'"/>
  89. </xsl:when>
  90. <xsl:when test="$object-class = 'tenant'">
  91. <xsl:value-of select="'tenantMembers'"/>
  92. </xsl:when>
  93. </xsl:choose>
  94. </req-params:param>
  95. <req-params:param name="returnProperties">
  96. <req-params:property name="userName"/>
  97. <req-params:property name="storeID"/>
  98. </req-params:param>
  99. </dlgctrl:XTS2Request>
  100. </xts:sequence>
  101. </xsl:template>
  102. </xsl:stylesheet>
  103. </xts:block>
  104. <!--
  105. ===============================================================================================
  106. processReponse - Process the response from the callMorphlet block and either displays
  107. the markup or processes the results
  108. ===============================================================================================
  109. -->
  110. <xts:block
  111. id="processResponse"
  112. nodelist="output,http,env,system,user,morphletResponse,credential,cookies"
  113. path="/portal/addEntries/logicsheets/process_added_entries.xslt"
  114. processor="XSLT"
  115. dependency="callMorphlet"
  116. type="exec"
  117. condition=".[ /root/env/param[@name='controller_state'] != '' ]"
  118. mandatory="false">
  119. <xts:logicsheet path="logicsheets/presentation/dialog/controller-templates.xsl"/>
  120. <xts:logicsheet path="logicsheets/portal.xsl"/>
  121. </xts:block>
  122. <!--
  123. ===============================================================================================
  124. Create some morphlet variables.
  125. Since this morphlet is used both from the New Group/Role wizard and for the Members
  126. tab in the Properties dialog, these 2 variables help the morphlet make appropriate
  127. determinations.
  128. ===============================================================================================
  129. -->
  130. <xts:block id="create_morphlet_vars" dependency="processResponse formlogic_init" type="exec" mode="interpret" processor="XSLT" condition=".[not(/root/mode='addEntries')]" mandatory="false">
  131. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  132. <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
  133. <xsl:template match="root">
  134. <xsl:variable name="in-wizard">
  135. <xsl:choose>
  136. <xsl:when test="/root/env/param[@name = 'm_new_class'] != ''">
  137. <xsl:text>true</xsl:text>
  138. </xsl:when>
  139. <xsl:otherwise>
  140. <xsl:text>false</xsl:text>
  141. </xsl:otherwise>
  142. </xsl:choose>
  143. </xsl:variable>
  144. <xsl:variable name="object-class">
  145. <xsl:choose>
  146. <xsl:when test="$in-wizard = 'true'">
  147. <xsl:value-of select="/root/env/param[@name = 'm_new_class']"/>
  148. </xsl:when>
  149. <xsl:otherwise>
  150. <xsl:value-of select="/root/env/param[@name = 'm_class']"/>
  151. </xsl:otherwise>
  152. </xsl:choose>
  153. </xsl:variable>
  154. <xsl:variable name="is-everyone">
  155. <xsl:choose>
  156. <xsl:when test="/root/env/param[@name='m_obj']='CAMID(&quot;::Everyone&quot;)'">true</xsl:when>
  157. <xsl:otherwise>false</xsl:otherwise>
  158. </xsl:choose>
  159. </xsl:variable>
  160. <xsl:variable name="is-all-auth-users">
  161. <xsl:choose>
  162. <xsl:when test="/root/env/param[@name='m_obj']='CAMID(&quot;::All Authenticated Users&quot;)'">true</xsl:when>
  163. <xsl:otherwise>false</xsl:otherwise>
  164. </xsl:choose>
  165. </xsl:variable>
  166. <!-- Append these variables in the input document. -->
  167. <xts:sequence>
  168. <xts:append>
  169. <morphlet>
  170. <variable name="in-wizard">
  171. <xsl:value-of select="$in-wizard"/>
  172. </variable>
  173. <variable name="object-class">
  174. <xsl:value-of select="$object-class"/>
  175. </variable>
  176. <variable name="is-everyone">
  177. <xsl:value-of select="$is-everyone"/>
  178. </variable>
  179. <variable name="is-all-auth-users">
  180. <xsl:value-of select="$is-all-auth-users"/>
  181. </variable>
  182. </morphlet>
  183. </xts:append>
  184. </xts:sequence>
  185. </xsl:template>
  186. </xsl:stylesheet>
  187. </xts:block>
  188. <!--
  189. ===============================================================================================
  190. Get the "members" property from Content Manager or from the packed list (web64encoded)
  191. In either case the input document will resemble this:
  192. <root>
  193. <object>
  194. <queryResponse xmlns="http://developer.cognos.com/schemas/xts-cm/1/">
  195. <role>
  196. <objectClass>role</objectClass>
  197. <defaultName>MarcRole</defaultName>
  198. <ancestors>
  199. <ancestorInfo>
  200. <searchPath>/directory</searchPath>
  201. <title>Directory</title>
  202. </ancestorInfo>
  203. <ancestorInfo>
  204. <searchPath>/directory/namespace[@defaultName='Cognos']</searchPath>
  205. <title>Cognos</title>
  206. </ancestorInfo>
  207. </ancestors>
  208. <members>
  209. <group>
  210. <objectClass>group</objectClass>
  211. <searchPath>/directory/namespace[@defaultName='Cognos']/group[@defaultName='Everyone']</searchPath>
  212. <ancestors>
  213. <ancestorInfo>
  214. <searchPath>/directory</searchPath>
  215. <title>Directory</title>
  216. </ancestorInfo>
  217. <ancestorInfo>
  218. <searchPath>/directory/namespace[@defaultName='Cognos']</searchPath>
  219. <title>Cognos</title>
  220. </ancestorInfo>
  221. </ancestors>
  222. </group>
  223. </members>
  224. </role>
  225. </queryResponse>
  226. </object>
  227. </root>
  228. ===============================================================================================
  229. -->
  230. <xts:block id="get_content" type="exec" mode="interpret" processor="XSLT" dependency="create_morphlet_vars" condition=".[not(/root/mode='addEntries')]">
  231. <xts:logicsheet path="logicsheets/buslogic.xslt"/>
  232. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:send="http://developer.cognos.com/schemas/xts/logic-sheet/xslt/brl/1/" xmlns:cm="http://developer.cognos.com/schemas/xts-cm/1/" xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt">
  233. <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
  234. <xsl:variable name="query-values" select="/root/env/param"/>
  235. <xsl:template match="/">
  236. <xts:sequence>
  237. <xsl:choose>
  238. <xsl:when test="$query-values[@name = 'm_p_members']">
  239. <xts:append>
  240. <xsl:value-of select="xtsext:web64decode(xtsext:cafaction('sign_unwrap',string($query-values[@name='m_p_members'])), true())" disable-output-escaping="yes"/>
  241. </xts:append>
  242. </xsl:when>
  243. <xsl:otherwise>
  244. <xts:append>
  245. <xsl:if test="/root/morphlet/variable[@name = 'in-wizard']='false'">
  246. <object>
  247. <xts:transform src="transforms/CM/post-process.xslt" processor="XSLT">
  248. <send:request provider="cm">
  249. <xts:transform src="transforms/CM/pre-process.xslt" processor="XSLT">
  250. <query xmlns="http://developer.cognos.com/schemas/xts-cm/1/">
  251. <search>
  252. <xsl:value-of select="/root/env/param[@name = 'm_obj']"/>
  253. <xsl:text>[permission(&quot;read&quot;)]</xsl:text>
  254. </search>
  255. <xsl:variable name="memberProp">
  256. <xsl:choose>
  257. <xsl:when test="/root/env/param[@name='m_class']='tenant'">
  258. <xsl:text>tenantMembers</xsl:text>
  259. </xsl:when>
  260. <xsl:otherwise>
  261. <xsl:text>members</xsl:text>
  262. </xsl:otherwise>
  263. </xsl:choose>
  264. </xsl:variable>
  265. <properties>
  266. <property name="searchPath"/>
  267. <property name="defaultName"/>
  268. <property name="{$memberProp}"/>
  269. <property name="permissions"/>
  270. <property name="iconURI"/>
  271. </properties>
  272. <options schemaInfo="true">
  273. <refProps>
  274. <refProp refPropName="{$memberProp}">
  275. <properties>
  276. <property name="defaultName"/>
  277. <property name="searchPath"/>
  278. <property name="ancestors"/>
  279. <property name="defaultScreenTip"/>
  280. <property name="userName"/>
  281. <property name="storeID"/>
  282. <property name="hidden"/>
  283. </properties>
  284. </refProp>
  285. </refProps>
  286. </options>
  287. </query>
  288. </xts:transform>
  289. </send:request>
  290. </xts:transform>
  291. </object>
  292. </xsl:if>
  293. <list/>
  294. </xts:append>
  295. </xsl:otherwise>
  296. </xsl:choose>
  297. <xts:delete select="/root/env/param[@name='pagerfrommembers']"/>
  298. <xts:delete select="/root/env/param[@name='pagertomembers']"/>
  299. <xts:delete select="/root/env/param[@name='pagerfrom_dmembers']"/>
  300. <xts:delete select="/root/env/param[@name='pagerto_dmembers']"/>
  301. </xts:sequence>
  302. </xsl:template>
  303. </xsl:stylesheet>
  304. </xts:block>
  305. <!--
  306. ===============================================================================================
  307. copy_members
  308. Copy the members from /root/object/cm:queryResponse//cm:members to /root/list
  309. ===============================================================================================
  310. -->
  311. <xts:block id="copy_members" dependency="get_content" type="exec" mode="interpret" processor="XML" condition=".[not(/root/mode='addEntries') and /root/morphlet/variable[@name='in-wizard']='false' and not(/root/env/param[@name = 'm_p_members'])]" mandatory="false">
  312. <xts:sequence>
  313. <xts:append select="/root/list">
  314. <xts:queryNode select="/root/object//*[(local-name()='members' or local-name()='tenantMembers') and namespace-uri()='http://developer.cognos.com/schemas/xts-cm/1/']/*"/>
  315. </xts:append>
  316. <xts:delete select="/root/object//*[(local-name()='members' or local-name()='tenantMembers') and namespace-uri()='http://developer.cognos.com/schemas/xts-cm/1/']/*"/>
  317. </xts:sequence>
  318. </xts:block>
  319. <!--
  320. ===============================================================================================
  321. execute_command
  322. Execute the operation: delete, additems_
  323. ===============================================================================================
  324. -->
  325. <xts:block id="execute_command" dependency="copy_members" type="exec" mode="interpret" processor="XSLT" condition=".[not(/root/mode='addEntries')]">
  326. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt" xmlns:x="x">
  327. <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
  328. <xsl:variable name="query-values" select="/root/env/param"/>
  329. <xsl:template match="/">
  330. <xts:sequence>
  331. <xsl:choose>
  332. <xsl:when test="$query-values[@name='listop']='delete'">
  333. <xsl:for-each select="/root/env/param[starts-with(@name,'members_chk_')]">
  334. <xsl:variable name="storeID">
  335. <xsl:value-of select="."/>
  336. </xsl:variable>
  337. <xsl:choose>
  338. <xsl:when test="/root/list/*[*[local-name()='storeID']=$storeID][x:added]">
  339. <!-- Since this was a newly added entry, just remove from the list. -->
  340. <xts:delete select="/root/list/*[*[local-name()='storeID']='{$storeID}']"/>
  341. </xsl:when>
  342. <xsl:otherwise>
  343. <!-- For entries that were already in the list, simply append a deleted marker. -->
  344. <xts:append select="/root/list/*[*[local-name()='storeID']='{$storeID}']">
  345. <xsl:element name="x:deleted" namespace="x"/>
  346. </xts:append>
  347. </xsl:otherwise>
  348. </xsl:choose>
  349. </xsl:for-each>
  350. <xts:delete select="/root/env/param[starts-with(@name, 'members_chk_')]"/>
  351. </xsl:when>
  352. <xsl:when test="/root/newEntries">
  353. <xsl:variable name="operations">
  354. <xsl:for-each select="/root/newEntries/*">
  355. <xsl:variable name="storeID" select="*[local-name()='storeID']"/>
  356. <xsl:choose>
  357. <xsl:when test="not(*[local-name()='storeID'] = /root/list/*/*[local-name()='storeID'])">
  358. <xts:append select="/root/list">
  359. <xsl:element name="{local-name()}" namespace="http://developer.cognos.com/schemas/xts-cm/1/">
  360. <xsl:copy-of select="*"/>
  361. <xsl:element name="x:added" namespace="x"/>
  362. </xsl:element>
  363. </xts:append>
  364. </xsl:when>
  365. <xsl:when test="/root/list/*[*[local-name()='storeID'] = $storeID]/x:deleted">
  366. <xts:delete select="/root/list/*[*[local-name()='storeID']='{$storeID}']/*[local-name() = 'deleted']"/>
  367. </xsl:when>
  368. <xsl:otherwise>
  369. <xts:append select="/root">
  370. <duplicateEntry/>
  371. </xts:append>
  372. </xsl:otherwise>
  373. </xsl:choose>
  374. </xsl:for-each>
  375. </xsl:variable>
  376. <xsl:if test="$operations">
  377. <xts:sequence>
  378. <xsl:copy-of select="$operations"/>
  379. <!-- Remove this node after we're done with it. -->
  380. <xts:delete select="/root/newEntries"/>
  381. </xts:sequence>
  382. </xsl:if>
  383. </xsl:when>
  384. </xsl:choose>
  385. </xts:sequence>
  386. </xsl:template>
  387. </xsl:stylesheet>
  388. </xts:block>
  389. <!--
  390. ===============================================================================================
  391. encode_list
  392. Serialize the data (web64 encoded)
  393. ===============================================================================================
  394. -->
  395. <xts:block id="encode_list" dependency="execute_command" type="exec" mode="interpret" processor="XSLT" condition=".[not(/root/mode='addEntries')]">
  396. <xts:logicsheet path="logicsheets/portal.xsl"/>
  397. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt" xmlns:cm="http://developer.cognos.com/schemas/xts-cm/1/" xmlns:pf="http://developer.cognos.com/schemas/xts/pf">
  398. <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
  399. <xsl:variable name="in-wizard" select="/root/morphlet/variable[@name = 'in-wizard']"/>
  400. <xsl:variable name="xtscm" select="'http://developer.cognos.com/schemas/xts-cm/1/'"/>
  401. <pf:serialize-xml/>
  402. <pf:variables/>
  403. <xsl:template match="/">
  404. <xts:sequence>
  405. <xts:delete select="/root/env/param[@name = 'm_p_members']"/>
  406. <xts:append select="/root/env">
  407. <xsl:variable name="markup">
  408. <xsl:apply-templates mode="markup" select="/root/list | /root/object"/>
  409. </xsl:variable>
  410. <param name="m_p_members">
  411. <xsl:value-of select="xtsext:cafaction( concat('sign_wrap_setpassportid_', $passport),xtsext:web64encode(string($markup), true()))"/>
  412. </param>
  413. </xts:append>
  414. </xts:sequence>
  415. </xsl:template>
  416. </xsl:stylesheet>
  417. </xts:block>
  418. <!--
  419. ===============================================================================================
  420. getObjects - get object class names
  421. ===============================================================================================
  422. -->
  423. <xts:block id="classNames" type="exec" mode="input" processor="XML" path="/portal/uiExtensions.xml">
  424. <xts:logicsheet path="/logicsheets/uiobjects/uiobjects_names.xslt"/>
  425. </xts:block>
  426. <!--
  427. ===============================================================================================
  428. Render the HTML page
  429. ===============================================================================================
  430. -->
  431. <xts:block id="renderPage" dependency="encode_list formlogic_init getTabs classNames" mode="output" processor="XSLT" type="exec" mimeType="text/html" condition=".[not(/root/mode='addEntries')]">
  432. <!-- portal specific information -->
  433. <xts:logicsheet path="logicsheets/portal.xsl"/>
  434. <!-- Get the new theme framework. -->
  435. <xts:logicsheet path="logicsheets/presentation/dialog/templates.xsl"/>
  436. <xts:logicsheet path="logicsheets/presentation/dialog/framework.xsl"/>
  437. <xts:logicsheet path="logicsheets/presentation/layout.xsl"/>
  438. <xts:logicsheet path="logicsheets/presentation/dialog/presentation.xsl"/>
  439. <xts:logicsheet path="logicsheets/presentation/controls/framework.xsl"/>
  440. <xts:logicsheet path="logicsheets/presentation/controls/presentation.xsl"/>
  441. <xts:logicsheet path="logicsheets/presentation/dialog/confirm.xslt"/>
  442. <!-- apply the form logic -->
  443. <xts:logicsheet path="logicsheets/formlogic.xslt"/>
  444. <!-- Prevent the href from appearing in the status bar. -->
  445. <xts:logicsheet path="logicsheets/validation.xslt"/> <xts:logicsheet path="logicsheets/presentation/touch_up.xslt"/>
  446. <xsl:stylesheet version="1.0"
  447. xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  448. xmlns:pf="http://developer.cognos.com/schemas/xts/pf"
  449. xmlns:lyt="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/layout/"
  450. xmlns:dp="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/dialog/presentation/"
  451. xmlns:df="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/dialog/framework/"
  452. xmlns:cp="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/controls/presentation/"
  453. xmlns:cf="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/controls/framework/"
  454. xmlns:dc="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/dialog/confirm/1/"
  455. xmlns:cm="http://developer.cognos.com/schemas/xts-cm/1/"
  456. xmlns:bus="http://developer.cognos.com/schemas/bibus/3/"
  457. xmlns:utml="http://developer.cognos.com/schemas/xts/logicsheet/xslt/formlogic/"
  458. xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt"
  459. xmlns:xts="http://developer.cognos.com/schemas/xts/"
  460. xmlns:x="x"
  461. xmlns:dt="http://developer.cognos.com/schemas/xts/logicsheets/xslt/presentation/dialog/templates/"
  462. exclude-result-prefixes="xsl lyt dp dc pf df cp cf cm utml xtsext x dt xts bus">
  463. <xsl:output method="html" version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
  464. <!-- current file name -->
  465. <xsl:variable name="mname" select="'properties_members.xts'"/>
  466. <xsl:variable name="m_class" select="/root/morphlet/variable[@name = 'object-class']"/>
  467. <xsl:variable name="in-wizard" select="/root/morphlet/variable[@name = 'in-wizard']"/>
  468. <xsl:variable name="is-everyone" select="/root/morphlet/variable[@name='is-everyone']='true'"/>
  469. <xsl:variable name="is-all-auth-users" select="/root/morphlet/variable[@name='is-all-auth-users']='true'"/>
  470. <!-- add any theme variables -->
  471. <pf:variables/>
  472. <xsl:variable name="back-url" select="key('env-param','backURL')"/>
  473. <pf:gen-icon/>
  474. <!-- start the output -->
  475. <xsl:template match="root">
  476. <xsl:variable name="the-object" select="/root/object/cm:queryResponse/child::*[position() = 1]"/>
  477. <xsl:variable name="theObjectName">
  478. <xsl:choose>
  479. <xsl:when test="key('env-param','m_name')!=''"><xsl:value-of select="key('env-param','m_name')"/></xsl:when>
  480. <xsl:otherwise><xsl:value-of select="$the-object/*[local-name()='defaultName']"/></xsl:otherwise>
  481. </xsl:choose>
  482. </xsl:variable>
  483. <xsl:variable name="wizardTitle">
  484. <xsl:choose>
  485. <xsl:when test="key('env-param','m_new_class')='distributionList'">
  486. <xts:string id="IDS_NEW_DISTRIBUTION_LIST_TITLE"/>
  487. </xsl:when>
  488. <xsl:when test="key('env-param','m_new_class')='role'">
  489. <xts:string id="IDS_NEW_COGNOS_ROLE_TITLE"/>
  490. </xsl:when>
  491. <xsl:when test="key('env-param','m_new_class')='group'">
  492. <xts:string id="IDS_NEW_COGNOS_GROUP_TITLE"/>
  493. </xsl:when>
  494. </xsl:choose>
  495. </xsl:variable>
  496. <xsl:variable name="browserTitle">
  497. <xsl:choose>
  498. <xsl:when test="$in-wizard != 'true' and $theObjectName!=''">
  499. <xts:string id="IDS_PROPERTIES_TITLE"><xts:param name="objectName"><span lang="{$contentLocale}"><xsl:value-of select="$theObjectName"/></span></xts:param></xts:string>
  500. </xsl:when>
  501. <xsl:when test="$in-wizard = 'true'">
  502. <xts:string id="IDS_NEW_TITLE_MEMBERS"><xts:param name="wizardTitle"><xsl:value-of select="$wizardTitle"/></xts:param></xts:string>
  503. </xsl:when>
  504. <xsl:otherwise>
  505. <xts:string id="IDS_PROPERTIES"/>
  506. </xsl:otherwise>
  507. </xsl:choose>
  508. </xsl:variable>
  509. <script language="javascript" src="{$webcontent}/{$app}/js/utilities.js"/>
  510. <!-- Page and title -->
  511. <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html></xsl:text><dp:page longTitle="$browserTitle">
  512. <dp:meta>
  513. <pf:meta/>
  514. <!-- Standard meta tags -->
  515. </dp:meta>
  516. <dp:script>
  517. <!-- Help system -->
  518. <pf:help context="HID_USERS_GROUPS_ROLES"/>
  519. <!-- Define selectall and deselectall functions.-->
  520. <dc:confirm-cancel/>
  521. <script language="javascript">
  522. function init()
  523. {
  524. if (document.pform.controller_state)
  525. {
  526. document.pform.controller_state.value = '';
  527. }
  528. }
  529. function doBMTCancel()
  530. {
  531. window.external.OnClose(1);
  532. }
  533. <xsl:if test="key('env-param','m_obj') = 'CAMID(&quot;::System Administrators&quot;)'">
  534. function validateDelete()
  535. {
  536. frm = document.pform;
  537. memberCount = <xsl:value-of select="count(/root/list/*[not(x:deleted)])"/>;
  538. pagerSize = <xsl:text/>
  539. <xsl:choose>
  540. <xsl:when test="key('session-param','linesPerPage')!=''">
  541. <xsl:value-of select="key('session-param','linesPerPage')"/>;
  542. </xsl:when>
  543. <xsl:otherwise>
  544. <xsl:value-of select="/root/system/param[@name='defaultPortalPreferences']/pref[@name='lines']"/>;
  545. </xsl:otherwise>
  546. </xsl:choose>
  547. <!-- if we're not on page 1 -->
  548. if (frm.m_memberspage &gt; 1)
  549. return true;
  550. <!-- if we have more members then the size of the pager, then we have multiple pages -->
  551. if (memberCount &gt; pagerSize)
  552. return true;
  553. <!-- get the number of members that were selected to be deleted -->
  554. i=0;
  555. checkedCount = 0;
  556. while (frm[i])
  557. {
  558. if (frm[i].name.indexOf("members_chk_") != -1)
  559. {
  560. if (frm[i].checked)
  561. {
  562. checkedCount++;
  563. }
  564. }
  565. i++;
  566. }
  567. if (checkedCount >= memberCount)
  568. {
  569. window.alert("<xts:string id="IDS_PROP_MEMBERS_DELETE_ERROR" encode="javascript"/>");
  570. return false;
  571. }
  572. return true;
  573. }
  574. </xsl:if>
  575. </script>
  576. </dp:script>
  577. <!--
  578. The value of this variable determines if the page is rendered in read-only mode.
  579. -->
  580. <xsl:variable name="has_policy_permission" select="contains(concat(' ', $the-object/cm:permissions, ' '), ' setPolicy ')"/>
  581. <xsl:variable name="has_write_permission">
  582. <xsl:choose>
  583. <xsl:when test="$the-object/cm:searchPath='CAMID(&quot;::Everyone&quot;)' or $the-object/cm:searchPath='CAMID(&quot;::All Authenticated Users&quot;)' or $the-object/cm:members/@modifiable='false' or (not(contains(concat(' ',$the-object/cm:permissions,' '),' write ')) and $in-wizard!='true')">
  584. <xsl:value-of select="'false'"/>
  585. </xsl:when>
  586. <xsl:otherwise>
  587. <xsl:value-of select="'true'"/>
  588. </xsl:otherwise>
  589. </xsl:choose>
  590. </xsl:variable>
  591. <xsl:variable name="showOKCancel" select="$has_write_permission = 'true' or $has_policy_permission"/>
  592. <utml:form name="pform" action="{$gateway}" method="post">
  593. <!-- Determine if this form is read-only. -->
  594. <utml:read-only>
  595. <xsl:choose>
  596. <xsl:when test="$has_write_permission='true'">
  597. <xsl:text>false</xsl:text>
  598. </xsl:when>
  599. <xsl:otherwise>
  600. <xsl:text>true</xsl:text>
  601. </xsl:otherwise>
  602. </xsl:choose>
  603. </utml:read-only>
  604. <!-- this defines the form command operation to be performed when all the collected properties are submitted. -->
  605. <utml:input type="hidden" name="ifrmcmd" utml:update="false">
  606. <utml:value>
  607. <xsl:choose>
  608. <xsl:when test="$in-wizard = 'true'">
  609. <xsl:text>create</xsl:text>
  610. </xsl:when>
  611. <xsl:otherwise>
  612. <xsl:text>save</xsl:text>
  613. </xsl:otherwise>
  614. </xsl:choose>
  615. </utml:value>
  616. </utml:input>
  617. <utml:input type="hidden" name="m_class" utml:update="false">
  618. <utml:value>
  619. <xsl:value-of select="$m_class"/>
  620. </utml:value>
  621. </utml:input>
  622. <utml:input type="hidden" name="controller_state" value="" utml:update="false"/>
  623. <!-- Dialog header -->
  624. <xsl:if test="$in-wizard='true'">
  625. <dp:header>
  626. <!-- Header titles -->
  627. <dp:title>
  628. <xsl:copy-of select="$browserTitle"/>
  629. </dp:title>
  630. <!-- Only put the description in the header for the wizard. -->
  631. <dp:description headerBorder="true">
  632. <xts:string id="IDS_NEW_INTRO_MEMBERS"/>
  633. </dp:description>
  634. <dp:close>
  635. <xsl:choose>
  636. <xsl:when test="key('env-param','from_bmt')">
  637. <a href="javascript:doBMTCancel()">
  638. <dp:closeMarker/>
  639. </a>
  640. </xsl:when>
  641. <xsl:when test="(/root/env/param[@name = 'ps_nav_stack']) and not(/root/env/param[@name = 'ps_nav_stack'] = '') ">
  642. <utml:a utml:op="stack-down">
  643. <dp:closeMarker/>
  644. </utml:a>
  645. </xsl:when>
  646. <xsl:otherwise>
  647. <a href="{$back-url}">
  648. <dp:closeMarker/>
  649. </a>
  650. </xsl:otherwise>
  651. </xsl:choose>
  652. </dp:close>
  653. </dp:header>
  654. </xsl:if>
  655. <xsl:if test="$in-wizard != 'true'">
  656. <dp:header>
  657. <!-- Header titles -->
  658. <dp:title>
  659. <xsl:copy-of select="$browserTitle"/>
  660. </dp:title>
  661. <dp:close>
  662. <xsl:choose>
  663. <xsl:when test="key('env-param','from_bmt')">
  664. <a href="javascript:doBMTCancel()">
  665. <dp:closeMarker/>
  666. </a>
  667. </xsl:when>
  668. <xsl:when test="$showOKCancel and (/root/env/param[@name = 'ps_nav_stack']) and not(/root/env/param[@name = 'ps_nav_stack'] = '') ">
  669. <utml:a utml:op="stack-down">
  670. <dp:closeMarker/>
  671. </utml:a>
  672. </xsl:when>
  673. <xsl:otherwise>
  674. <a href="{$back-url}">
  675. <dp:closeMarker/>
  676. </a>
  677. </xsl:otherwise>
  678. </xsl:choose>
  679. </dp:close>
  680. </dp:header>
  681. <!-- Property tabs -->
  682. <df:propertiesTabs select="members">
  683. <df:hasSetPolicy><xsl:value-of select="$has_policy_permission"/></df:hasSetPolicy>
  684. </df:propertiesTabs>
  685. <!-- Tab description -->
  686. <dp:description>
  687. <xsl:choose>
  688. <xsl:when test="$is-everyone = true()">
  689. <xts:string id="IDS_PROP_MEMBERS_EVERYONE"/>
  690. </xsl:when>
  691. <xsl:when test="$is-all-auth-users = true()">
  692. <xts:string id="IDS_PROP_MEMBERS_ALL_AUTHENTICATED_USERS"/>
  693. </xsl:when>
  694. <xsl:otherwise>
  695. <xts:string id="IDS_NEW_INTRO_MEMBERS"/>
  696. </xsl:otherwise>
  697. </xsl:choose>
  698. </dp:description>
  699. </xsl:if>
  700. <xsl:if test="$is-everyone = false() and $is-all-auth-users = false()">
  701. <xsl:variable name="objectClassCount" select="count(/root/list/*[not(x:deleted)]/*[local-name()='objectClass'])"/>
  702. <xsl:if test="$objectClassCount &gt; count(/root/list/*[not(x:deleted)]/*[(local-name()='defaultName' and .!='') or (local-name()='userName' and .!='')]) or $objectClassCount &gt; count(/root/list/*[not(x:deleted)]/*[local-name()='ancestors' and .!=''])">
  703. <lyt:layout style="1" border="no">
  704. <lyt:section>
  705. <dp:list>
  706. <dp:section>
  707. <dp:text>
  708. <img width="32" height="32">
  709. <xsl:attribute name="src"><xsl:value-of select="concat($image_root,'msg_warning.gif')"/></xsl:attribute>
  710. <xsl:attribute name="alt"></xsl:attribute>
  711. </img>
  712. <xts:string id="IDS_PROP_MEMBERS_WARN_HIDDEN"/>
  713. </dp:text>
  714. </dp:section>
  715. </dp:list>
  716. </lyt:section>
  717. </lyt:layout>
  718. </xsl:if>
  719. <xsl:variable name="width">
  720. <xsl:choose>
  721. <xsl:when test="$in-wizard='true'">70%</xsl:when>
  722. <xsl:otherwise>100%</xsl:otherwise>
  723. </xsl:choose>
  724. </xsl:variable>
  725. <lyt:layout style="1" border="no">
  726. <lyt:section>
  727. <utml:input type="hidden" name="listop" value="" utml:update="false"/>
  728. <utml:change name="changed_m_p_members" utml:update="false" utml:condition="count( /root/list/*/x:added | /root/list/*/x:deleted ) > 0"/>
  729. <cf:main-pager-section name="members" form="pform" width="{$width}" genDelete="yes">
  730. <cf:param name="item-path">/root/list/*[not(x:deleted)]</cf:param>
  731. <cf:param name="target">concat(concat($app,'/'),$mname)</cf:param>
  732. <cf:param name="lines-per-page">
  733. <xsl:choose>
  734. <xsl:when test="key('session-param','linesPerPage')!=''">
  735. <xsl:value-of select="key('session-param','linesPerPage')"/>
  736. </xsl:when>
  737. <xsl:otherwise>
  738. <xsl:value-of select="/root/system/param[@name='defaultPortalPreferences']/pref[@name='lines']"/>
  739. </xsl:otherwise>
  740. </xsl:choose>
  741. </cf:param>
  742. <cf:param name="actions">
  743. <cp:action>
  744. <xsl:if test="$has_write_permission='true'">
  745. <utml:a utml:op="maintain" utml:hide-when-read-only="true">
  746. <utml:href>
  747. document.pform.controller_state.value='addEntries|navigate';
  748. </utml:href>
  749. <utml:target>
  750. <xsl:value-of select="concat($app, '/', $mname)"/>
  751. </utml:target>
  752. <xsl:text/><xts:string id="IDS_COMMAND_ADD"/><xsl:text/>
  753. </utml:a>
  754. </xsl:if>
  755. </cp:action>
  756. <cp:action>
  757. <xsl:if test="$has_write_permission='true'">
  758. <utml:a>
  759. <utml:href>
  760. <xsl:text>if(!isSelected('members_chk_')){alert("<xts:string id="IDS_REMOVE_WARNING" encode="javascript"/>");return;}</xsl:text>
  761. <!-- if we're dealing with the system administrators group then make sure the user doesn't delete all the members -->
  762. <xsl:if test="key('env-param','m_obj') = 'CAMID(&quot;::System Administrators&quot;)'">
  763. <xsl:text/>if(!validateDelete())return;
  764. </xsl:if>
  765. <xsl:text>document.pform.listop.value='delete';if(window.preDeletemembers)preDeletemembers('pform','members_chk_');</xsl:text>
  766. </utml:href>
  767. <utml:target>
  768. <xsl:value-of select="concat($app,'/',$mname)"/>
  769. </utml:target>
  770. <xsl:text/><xts:string id="IDS_REMOVE"/><xsl:text/>
  771. </utml:a>
  772. </xsl:if>
  773. </cp:action>
  774. </cf:param>
  775. <cf:param name="rows">
  776. <cp:tableHeader>
  777. <cp:columnHeader width="16" toggleName="members_chk_" noLabel="true" utml="utml"/>
  778. <cp:columnHeader width="16"/>
  779. <cp:columnHeader width="100%">
  780. <!-- All of this is to align the header (...> Name) with the contents of the table-->
  781. <img height="5" width="1" border="0"><xsl:attribute name="src"><xsl:value-of select="$webcontent"/>/images/space.gif</xsl:attribute></img>
  782. <xsl:text/><xts:string id="IDS_PATH_INDICATOR"/><xsl:text>&#160;</xsl:text>
  783. <img height="5" width="1" border="0"><xsl:attribute name="src"><xsl:value-of select="$webcontent"/>/images/space.gif</xsl:attribute></img>
  784. <xsl:text/><xts:string id="IDS_NAME"/><xsl:text/>
  785. </cp:columnHeader>
  786. <cp:columnHeader width="150">
  787. <xts:string id="IDS_TYPE"/>
  788. </cp:columnHeader>
  789. </cp:tableHeader>
  790. <cp:tableContent>
  791. <xsl:variable name="entryLabel">
  792. <xsl:choose>
  793. <xsl:when test="(cm:defaultName!='' or cm:userName!='') and cm:ancestors!=''">
  794. <xsl:value-of select="cm:defaultName"/>
  795. <xsl:if test="cm:userName!=''">
  796. <xsl:text> (</xsl:text>
  797. <xsl:value-of select="cm:userName"/>
  798. <xsl:text>)</xsl:text>
  799. </xsl:if>
  800. </xsl:when>
  801. <xsl:otherwise>
  802. <xts:string id="IDS_PROP_ENTRY_NOT_FOUND"/>
  803. </xsl:otherwise>
  804. </xsl:choose>
  805. </xsl:variable>
  806. <cp:columnContent>
  807. <xsl:choose>
  808. <xsl:when test="$has_write_permission='true'">
  809. <utml:input type="checkbox" utml:update="false">
  810. <xsl:attribute name="aria-label"><xts:string id="IDS_SELECTION_FOR_PAGER_ITEM" encode="html"><xts:param name="pagerItemName"><xsl:value-of select="$entryLabel"/></xts:param></xts:string></xsl:attribute>
  811. <utml:prefix>
  812. <xsl:text>members_chk_</xsl:text>
  813. </utml:prefix>
  814. <utml:name>
  815. <xsl:value-of select="position()"/>
  816. </utml:name>
  817. <utml:value>
  818. <xsl:value-of select="cm:storeID"/>
  819. </utml:value>
  820. </utml:input>
  821. </xsl:when>
  822. <xsl:otherwise>
  823. <xsl:text>&#160;</xsl:text>
  824. </xsl:otherwise>
  825. </xsl:choose>
  826. </cp:columnContent>
  827. <cp:columnContent>
  828. <xsl:call-template name="gen-icon">
  829. <xsl:with-param name="showAction" select="false()"/>
  830. <xsl:with-param name="hiddenObject" select="cm:hidden"/>
  831. </xsl:call-template>
  832. </cp:columnContent>
  833. <cp:columnContent>
  834. <xsl:choose>
  835. <xsl:when test="(cm:defaultName!='' or cm:userName!='') and cm:ancestors!=''">
  836. <img width="20" height="16" align="absmiddle" src="{$skin_images}path.gif">
  837. <xsl:attribute name="alt">
  838. <cf:do-the-path-link>
  839. <cf:param name="familytree">cm:ancestors</cf:param>
  840. <cf:param name="familymember">cm:defaultName</cf:param>
  841. <cf:param name="onlyAncestors">true</cf:param>
  842. </cf:do-the-path-link>
  843. </xsl:attribute>
  844. </img>
  845. <xsl:text>&#160;</xsl:text>
  846. <xsl:value-of select="$entryLabel"/>
  847. </xsl:when>
  848. <xsl:otherwise>
  849. <xts:string id="IDS_PROP_ENTRY_NOT_FOUND"/>
  850. </xsl:otherwise>
  851. </xsl:choose>
  852. </cp:columnContent>
  853. <cp:columnContent>
  854. <xsl:if test="cm:objectClass!='nil'">
  855. <xsl:variable name="objectClass"><xsl:value-of select="cm:objectClass"/></xsl:variable>
  856. <xsl:value-of select="/root/objectClass/class[@name=$objectClass]"/>
  857. </xsl:if>
  858. </cp:columnContent>
  859. </cp:tableContent>
  860. </cf:param>
  861. </cf:main-pager-section>
  862. </lyt:section>
  863. </lyt:layout>
  864. </xsl:if>
  865. <dp:footer>
  866. <xsl:choose>
  867. <xsl:when test="$in-wizard = 'true'">
  868. <xsl:choose>
  869. <xsl:when test="key('env-param', 'from_bmt')">
  870. <df:button df:id="IDS_CANCEL" df:style="href" df:href="javascript:doBMTCancel()"/>
  871. </xsl:when>
  872. <xsl:otherwise>
  873. <df:button df:id="IDS_CANCEL" df:style="back-url"/>
  874. </xsl:otherwise>
  875. </xsl:choose>
  876. <df:button df:id="IDS_BACK" df:style="maintain">
  877. <df:target>
  878. <xsl:value-of select="concat($app, '/new_general.xts')"/>
  879. </df:target>
  880. </df:button>
  881. <df:button df:id="IDS_NEXT"/>
  882. <df:button df:id="IDS_FINISH" utml:validate="true" df:style="submit"/>
  883. </xsl:when>
  884. <xsl:otherwise>
  885. <xsl:choose>
  886. <xsl:when test="$showOKCancel">
  887. <df:button df:id="IDS_OK" utml:validate="true" df:style="submit"/>
  888. <xsl:choose>
  889. <xsl:when test="key('env-param', 'ps_nav_stack') and not(key('env-param', 'ps_nav_stack') = '') ">
  890. <df:button df:id="IDS_CANCEL" df:style="stack-down" onclick="{$dc-confirm-cancel}"/>
  891. </xsl:when>
  892. <xsl:otherwise>
  893. <df:button df:id="IDS_CANCEL" df:style="back-url" onclick="{$dc-confirm-cancel}"/>
  894. </xsl:otherwise>
  895. </xsl:choose>
  896. </xsl:when>
  897. <xsl:otherwise>
  898. <df:button df:id="IDS_CLOSE" df:style="back-url"/>
  899. </xsl:otherwise>
  900. </xsl:choose>
  901. </xsl:otherwise>
  902. </xsl:choose>
  903. </dp:footer>
  904. <!-- if the user tried to add a duplicate entry -->
  905. <script language="javascript">
  906. <xsl:if test="/root/duplicateEntry">
  907. <xsl:variable name="msg">
  908. <xts:string id="IDS_DUPLICATE_ENTRY"/>
  909. </xsl:variable>
  910. window.alert('<xsl:value-of select="normalize-space($msg)"/>');
  911. </xsl:if>
  912. </script>
  913. </utml:form>
  914. </dp:page>
  915. </xsl:template>
  916. </xsl:stylesheet>
  917. </xts:block>
  918. <xts:block id="debug" type="exec" mode="output" processor="XSLT" condition=".[/root/session/param[@name = 'debug'] = '1']" mandatory="false" mimeType="text/html" dependency="renderPage processResponse">
  919. <!-- Get the debug logic sheet -->
  920. <xts:logicsheet path="logicsheets/debuglogic.xslt"/>
  921. <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">
  922. <xsl:output method="html" version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
  923. <xsl:template match="/">
  924. <dbg:dumpxml select="/root"/>
  925. </xsl:template>
  926. </xsl:stylesheet>
  927. </xts:block>
  928. </xts:morphlet>