get-meta.xsl 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!-- This file is part of the DITA Open Toolkit project hosted on
  3. Sourceforge.net. See the accompanying license.txt file for
  4. applicable licenses.-->
  5. <!-- (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved. -->
  6. <xsl:stylesheet version="2.0"
  7. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  8. <!-- Get each value in each <keywords>. Nested indexterms should have unique entries. Other
  9. elements (based on keyword) cannot nest. -->
  10. <xsl:key name="meta-keywords" match="*[ancestor::*[contains(@class,' topic/keywords ')]]" use="text()[1]"/>
  11. <xsl:template name="getMeta">
  12. <!-- Processing note:
  13. getMeta is issued from the topic/topic context, therefore it is looking DOWN
  14. for most data except for attributes on topic, which will be current context.
  15. -->
  16. <!-- = = = = = = = = = = = CONTENT = = = = = = = = = = = -->
  17. <!-- CONTENT: Type -->
  18. <xsl:apply-templates select="." mode="gen-type-metadata"/>
  19. <!-- CONTENT: Title - title -->
  20. <xsl:apply-templates select="*[contains(@class,' topic/title ')] |
  21. self::dita/*[1]/*[contains(@class,' topic/title ')]" mode="gen-metadata"/>
  22. <!-- CONTENT: Description - shortdesc -->
  23. <xsl:apply-templates select="*[contains(@class,' topic/shortdesc ')] |
  24. self::dita/*[1]/*[contains(@class,' topic/shortdesc ')]" mode="gen-metadata"/>
  25. <xsl:apply-templates select="*[contains(@class,' topic/abstract ')] |
  26. self::dita/*[1]/*[contains(@class,' topic/abstract ')]" mode="gen-shortdesc-metadata"/>
  27. <!-- CONTENT: Source - prolog/source/@href -->
  28. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/source ')]/@href |
  29. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/source ')]/@href" mode="gen-metadata"/>
  30. <!-- CONTENT: Coverage prolog/metadata/category -->
  31. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/category ')] |
  32. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/category ')]" mode="gen-metadata"/>
  33. <!-- CONTENT: Subject - prolog/metadata/keywords -->
  34. <xsl:apply-templates select="." mode="gen-keywords-metadata"/>
  35. <!-- CONTENT: Relation - related-links -->
  36. <xsl:apply-templates select="*[contains(@class,' topic/related-links ')]/descendant::*/@href |
  37. self::dita/*/*[contains(@class,' topic/related-links ')]/descendant::*/@href" mode="gen-metadata"/>
  38. <!-- = = = = = = = = = = = Product - Audience = = = = = = = = = = = -->
  39. <!-- Audience -->
  40. <!-- prolog/metadata/audience/@experiencelevel and other attributes -->
  41. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@experiencelevel |
  42. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@experiencelevel" mode="gen-metadata"/>
  43. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@importance |
  44. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@importance" mode="gen-metadata"/>
  45. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@job |
  46. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@job" mode="gen-metadata"/>
  47. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@name |
  48. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@name" mode="gen-metadata"/>
  49. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@type |
  50. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/audience ')]/@type" mode="gen-metadata"/>
  51. <!-- <prodname> -->
  52. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/prodname ')] |
  53. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/prodname ')]" mode="gen-metadata"/>
  54. <!-- <vrmlist><vrm modification="3" release="2" version="5"/></vrmlist> -->
  55. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/vrmlist ')]/*[contains(@class,' topic/vrm ')]/@version |
  56. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/vrmlist ')]/*[contains(@class,' topic/vrm ')]/@version" mode="gen-metadata"/>
  57. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/vrmlist ')]/*[contains(@class,' topic/vrm ')]/@release |
  58. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/vrmlist ')]/*[contains(@class,' topic/vrm ')]/@release" mode="gen-metadata"/>
  59. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/vrmlist ')]/*[contains(@class,' topic/vrm ')]/@modification |
  60. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/vrmlist ')]/*[contains(@class,' topic/vrm ')]/@modification" mode="gen-metadata"/>
  61. <!-- <brand> -->
  62. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/brand ')] |
  63. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/brand ')]" mode="gen-metadata"/>
  64. <!-- <component> -->
  65. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/component ')] |
  66. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/component ')]" mode="gen-metadata"/>
  67. <!-- <featnum> -->
  68. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/featnum ')] |
  69. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/featnum ')]" mode="gen-metadata"/>
  70. <!-- <prognum> -->
  71. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/prognum ')] |
  72. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/prognum ')]" mode="gen-metadata"/>
  73. <!-- <platform> -->
  74. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/platform ')] |
  75. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/platform ')]" mode="gen-metadata"/>
  76. <!-- <series> -->
  77. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/series ')] |
  78. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/prodinfo ')]/*[contains(@class,' topic/series ')]" mode="gen-metadata"/>
  79. <!-- = = = = = = = = = = = INTELLECTUAL PROPERTY = = = = = = = = = = = -->
  80. <!-- INTELLECTUAL PROPERTY: Contributor - prolog/author -->
  81. <!-- INTELLECTUAL PROPERTY: Creator -->
  82. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/author ')] |
  83. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/author ')]" mode="gen-metadata"/>
  84. <!-- INTELLECTUAL PROPERTY: Publisher - prolog/publisher -->
  85. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/publisher ')] |
  86. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/publisher ')]" mode="gen-metadata"/>
  87. <!-- INTELLECTUAL PROPERTY: Rights - prolog/copyright -->
  88. <!-- Put primary first, then secondary, then remainder -->
  89. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/copyright ')][@type='primary'] |
  90. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/copyright ')][@type='primary']" mode="gen-metadata"/>
  91. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/copyright ')][@type='secondary'] |
  92. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/copyright ')][@type='seconday']" mode="gen-metadata"/>
  93. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/copyright ')][not(@type)] |
  94. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/copyright ')][not(@type)]" mode="gen-metadata"/>
  95. <!-- Usage Rights - prolog/permissions -->
  96. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/permissions ')] |
  97. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/permissions ')]" mode="gen-metadata"/>
  98. <!-- = = = = = = = = = = = INSTANTIATION = = = = = = = = = = = -->
  99. <!-- INSTANTIATION: Date - prolog/critdates/created -->
  100. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/created ')] |
  101. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/created ')]" mode="gen-metadata"/>
  102. <!-- prolog/critdates/revised/@modified -->
  103. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/revised ')]/@modified |
  104. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/revised ')]/@modified" mode="gen-metadata"/>
  105. <!-- prolog/critdates/revised/@golive -->
  106. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/revised ')]/@golive |
  107. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/revised ')]/@golive" mode="gen-metadata"/>
  108. <!-- prolog/critdates/revised/@expiry -->
  109. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/revised ')]/@expiry |
  110. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/revised ')]/@expiry" mode="gen-metadata"/>
  111. <!-- prolog/metadata/othermeta -->
  112. <xsl:apply-templates select="*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/othermeta ')] |
  113. self::dita/*[1]/*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/othermeta ')]" mode="gen-metadata"/>
  114. <!-- INSTANTIATION: Format -->
  115. <xsl:apply-templates select="." mode="gen-format-metadata"/>
  116. <!-- INSTANTIATION: Identifier --> <!-- id is an attribute on Topic -->
  117. <xsl:apply-templates select="@id | self::dita/*[1]/@id" mode="gen-metadata"/>
  118. <!-- INSTANTIATION: Language -->
  119. <xsl:apply-templates select="@xml:lang | self::dita/*[1]/@xml:lang" mode="gen-metadata"/>
  120. </xsl:template>
  121. <!-- CONTENT: Type -->
  122. <xsl:template match="dita" mode="gen-type-metadata">
  123. <xsl:apply-templates select="*[1]" mode="gen-type-metadata"/>
  124. </xsl:template>
  125. <xsl:template match="*" mode="gen-type-metadata">
  126. <meta name="DC.Type" content="{name(.)}"/>
  127. <xsl:value-of select="$newline"/>
  128. </xsl:template>
  129. <!-- CONTENT: Title - title -->
  130. <xsl:template match="*[contains(@class,' topic/title ')]" mode="gen-metadata">
  131. <xsl:variable name="titlemeta">
  132. <xsl:apply-templates select="*|text()" mode="text-only"/>
  133. </xsl:variable>
  134. <meta name="DC.Title">
  135. <xsl:attribute name="content"><xsl:value-of select="normalize-space($titlemeta)"/></xsl:attribute>
  136. </meta>
  137. <xsl:value-of select="$newline"/>
  138. </xsl:template>
  139. <!-- CONTENT: Description - shortdesc -->
  140. <xsl:template match="*[contains(@class,' topic/shortdesc ')]" mode="gen-metadata">
  141. <xsl:variable name="shortmeta">
  142. <xsl:apply-templates select="*|text()" mode="text-only"/>
  143. </xsl:variable>
  144. <meta name="abstract">
  145. <xsl:attribute name="content"><xsl:value-of select="normalize-space($shortmeta)"/></xsl:attribute>
  146. </meta>
  147. <xsl:value-of select="$newline"/>
  148. <meta name="description">
  149. <xsl:attribute name="content"><xsl:value-of select="normalize-space($shortmeta)"/></xsl:attribute>
  150. </meta>
  151. <xsl:value-of select="$newline"/>
  152. </xsl:template>
  153. <xsl:template match="*[contains(@class,' topic/abstract ')]" mode="gen-shortdesc-metadata">
  154. <xsl:variable name="shortmeta">
  155. <xsl:for-each select="*[contains(@class,' topic/shortdesc ')]">
  156. <xsl:text> </xsl:text>
  157. <xsl:apply-templates select="*|text()" mode="text-only"/>
  158. </xsl:for-each>
  159. </xsl:variable>
  160. <xsl:if test="normalize-space($shortmeta)!=''">
  161. <meta name="abstract">
  162. <xsl:attribute name="content"><xsl:value-of select="normalize-space($shortmeta)"/></xsl:attribute>
  163. </meta>
  164. <xsl:value-of select="$newline"/>
  165. <meta name="description">
  166. <xsl:attribute name="content"><xsl:value-of select="normalize-space($shortmeta)"/></xsl:attribute>
  167. </meta>
  168. <xsl:value-of select="$newline"/>
  169. </xsl:if>
  170. </xsl:template>
  171. <!-- CONTENT: Source - prolog/source/@href -->
  172. <xsl:template match="*[contains(@class,' topic/source ')]/@href" mode="gen-metadata">
  173. <meta name="DC.Source" content="{normalize-space(.)}"/>
  174. <xsl:value-of select="$newline"/>
  175. </xsl:template>
  176. <!-- CONTENT: Coverage prolog/metadata/category -->
  177. <xsl:template match="*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/category ')]" mode="gen-metadata">
  178. <meta name="DC.Coverage" content="{normalize-space(.)}"/>
  179. <xsl:value-of select="$newline"/>
  180. </xsl:template>
  181. <!-- CONTENT: Subject - prolog/metadata/keywords -->
  182. <xsl:template match="*" mode="gen-keywords-metadata">
  183. <xsl:variable name="keywords-content">
  184. <!-- for each item inside keywords (including nested index terms) -->
  185. <xsl:for-each select="descendant::*[contains(@class,' topic/prolog ')]/*[contains(@class,' topic/metadata ')]/*[contains(@class,' topic/keywords ')]/descendant-or-self::*">
  186. <!-- If this is the first term or keyword with this value -->
  187. <xsl:if test="generate-id(key('meta-keywords',text()[1])[1])=generate-id(.)">
  188. <xsl:if test="position()>2"><xsl:text>, </xsl:text></xsl:if>
  189. <xsl:value-of select="normalize-space(text()[1])"/>
  190. </xsl:if>
  191. </xsl:for-each>
  192. </xsl:variable>
  193. <xsl:if test="string-length($keywords-content)>0">
  194. <meta name="DC.subject" content="{$keywords-content}"/>
  195. <xsl:value-of select="$newline"/>
  196. <meta name="keywords" content="{$keywords-content}"/>
  197. <xsl:value-of select="$newline"/>
  198. </xsl:if>
  199. </xsl:template>
  200. <!-- CONTENT: Relation - related-links -->
  201. <xsl:template match="*[contains(@class,' topic/link ')]/@href" mode="gen-metadata">
  202. <xsl:variable name="linkmeta" select="normalize-space(.)"/>
  203. <xsl:choose>
  204. <xsl:when test="substring($linkmeta,1,1)='#'" /> <!-- ignore internal file links -->
  205. <xsl:otherwise>
  206. <xsl:variable name="linkmeta_ext">
  207. <xsl:choose>
  208. <xsl:when test="not(../@format) or ../@format = 'dita'">
  209. <xsl:call-template name="replace-extension">
  210. <xsl:with-param name="filename" select="$linkmeta"/>
  211. <xsl:with-param name="extension" select="$OUTEXT"/>
  212. </xsl:call-template>
  213. </xsl:when>
  214. <xsl:otherwise>
  215. <xsl:value-of select="$linkmeta"/>
  216. </xsl:otherwise>
  217. </xsl:choose>
  218. </xsl:variable>
  219. <meta name="DC.Relation" scheme="URI">
  220. <xsl:attribute name="content"><xsl:value-of select="$linkmeta_ext"/></xsl:attribute>
  221. </meta>
  222. <xsl:value-of select="$newline"/>
  223. </xsl:otherwise>
  224. </xsl:choose>
  225. </xsl:template>
  226. <!-- Do not let any other @href's inside related-links generate metadata -->
  227. <xsl:template match="*/@href" mode="gen-metadata" priority="0"/>
  228. <!-- INTELLECTUAL PROPERTY: Contributor - prolog/author -->
  229. <!-- INTELLECTUAL PROPERTY: Creator -->
  230. <!-- Default is type='creator' -->
  231. <xsl:template match="*[contains(@class,' topic/author ')]" mode="gen-metadata">
  232. <xsl:choose>
  233. <xsl:when test="@type= 'contributor'">
  234. <meta name="DC.Contributor" content="{normalize-space(.)}"/>
  235. </xsl:when>
  236. <xsl:otherwise>
  237. <meta name="DC.Creator" content="{normalize-space(.)}"/>
  238. </xsl:otherwise>
  239. </xsl:choose>
  240. <xsl:value-of select="$newline"/>
  241. </xsl:template>
  242. <!-- INTELLECTUAL PROPERTY: Publisher - prolog/publisher -->
  243. <xsl:template match="*[contains(@class,' topic/publisher ')]" mode="gen-metadata">
  244. <meta name="DC.Publisher" content="{normalize-space(.)}"/>
  245. <xsl:value-of select="$newline"/>
  246. </xsl:template>
  247. <!-- Rights - prolog/copyright -->
  248. <xsl:template match="*[contains(@class,' topic/copyright ')]" mode="gen-metadata">
  249. <meta name="copyright">
  250. <xsl:attribute name="content">
  251. <xsl:choose>
  252. <!-- ./copyrholder/text() -->
  253. <xsl:when test="*[contains(@class,' topic/copyrholder ')]/text()">
  254. <xsl:value-of select="normalize-space(*[contains(@class,' topic/copyrholder ')])"/>
  255. </xsl:when>
  256. <xsl:otherwise>
  257. <xsl:text>(C) </xsl:text>
  258. <xsl:call-template name="getVariable">
  259. <xsl:with-param name="id" select="'Copyright'"/>
  260. </xsl:call-template>
  261. </xsl:otherwise>
  262. </xsl:choose>
  263. <!-- copyryear -->
  264. <xsl:for-each select="*[contains(@class,' topic/copyryear ')]">
  265. <xsl:text> </xsl:text><xsl:value-of select="@year"/>
  266. </xsl:for-each>
  267. </xsl:attribute>
  268. <xsl:choose>
  269. <xsl:when test="@type = 'secondary'">
  270. <xsl:attribute name="type">secondary</xsl:attribute>
  271. </xsl:when>
  272. <xsl:otherwise>
  273. <xsl:attribute name="type">primary</xsl:attribute>
  274. </xsl:otherwise>
  275. </xsl:choose>
  276. </meta>
  277. <xsl:value-of select="$newline"/>
  278. <meta name="DC.Rights.Owner">
  279. <xsl:attribute name="content">
  280. <xsl:choose>
  281. <xsl:when test="*[contains(@class,' topic/copyrholder ')]/text()">
  282. <xsl:value-of select="normalize-space(*[contains(@class,' topic/copyrholder ')])"/>
  283. </xsl:when>
  284. <xsl:otherwise>
  285. <xsl:text>(C) </xsl:text>
  286. <xsl:call-template name="getVariable">
  287. <xsl:with-param name="id" select="'Copyright'"/>
  288. </xsl:call-template>
  289. </xsl:otherwise>
  290. </xsl:choose>
  291. <xsl:for-each select="*[contains(@class,' topic/copyryear ')]">
  292. <xsl:text> </xsl:text><xsl:value-of select="@year"/>
  293. </xsl:for-each>
  294. </xsl:attribute>
  295. <xsl:choose>
  296. <xsl:when test="@type = 'secondary'">
  297. <xsl:attribute name="type">secondary</xsl:attribute>
  298. </xsl:when>
  299. <xsl:otherwise>
  300. <xsl:attribute name="type">primary</xsl:attribute>
  301. </xsl:otherwise>
  302. </xsl:choose>
  303. </meta>
  304. <xsl:value-of select="$newline"/>
  305. </xsl:template>
  306. <!-- Usage Rights - prolog/permissions -->
  307. <xsl:template match="*[contains(@class,' topic/permissions ')]" mode="gen-metadata">
  308. <meta name="DC.Rights.Usage" content="{@view}"/>
  309. <xsl:value-of select="$newline"/>
  310. </xsl:template>
  311. <!-- = = = = = = = = = = = Product - Audience = = = = = = = = = = = -->
  312. <!-- Audience -->
  313. <xsl:template match="*[contains(@class,' topic/audience ')]/@experiencelevel" mode="gen-metadata">
  314. <meta name="DC.Audience.Experiencelevel" content="{.}"/>
  315. <xsl:value-of select="$newline"/>
  316. </xsl:template>
  317. <xsl:template match="*[contains(@class,' topic/audience ')]/@importance" mode="gen-metadata">
  318. <meta name="DC.Audience.Importance" content="{.}"/>
  319. <xsl:value-of select="$newline"/>
  320. </xsl:template>
  321. <xsl:template match="*[contains(@class,' topic/audience ')]/@name" mode="gen-metadata">
  322. <meta name="DC.Audience.Name" content="{.}"/>
  323. <xsl:value-of select="$newline"/>
  324. </xsl:template>
  325. <xsl:template match="*[contains(@class,' topic/audience ')]/@job" mode="gen-metadata">
  326. <xsl:choose>
  327. <xsl:when test=".='other'">
  328. <meta name="DC.Audience.Job" content="{normalize-space(../@otherjob)}"/>
  329. </xsl:when>
  330. <xsl:otherwise>
  331. <meta name="DC.Audience.Job" content="{.}"/>
  332. </xsl:otherwise>
  333. </xsl:choose>
  334. <xsl:value-of select="$newline"/>
  335. </xsl:template>
  336. <xsl:template match="*[contains(@class,' topic/audience ')]/@type" mode="gen-metadata">
  337. <xsl:choose>
  338. <xsl:when test=".='other'">
  339. <meta name="DC.Audience.Type" content="{normalize-space(../@othertype)}"/>
  340. </xsl:when>
  341. <xsl:otherwise>
  342. <meta name="DC.Audience.Type" content="{.}"/>
  343. </xsl:otherwise>
  344. </xsl:choose>
  345. <xsl:value-of select="$newline"/>
  346. </xsl:template>
  347. <xsl:template match="*[contains(@class,' topic/prodname ')]" mode="gen-metadata">
  348. <xsl:variable name="prodnamemeta">
  349. <xsl:apply-templates select="*|text()" mode="text-only"/>
  350. </xsl:variable>
  351. <meta name="prodname">
  352. <xsl:attribute name="content"><xsl:value-of select="normalize-space($prodnamemeta)"/></xsl:attribute>
  353. </meta>
  354. <xsl:value-of select="$newline"/>
  355. </xsl:template>
  356. <xsl:template match="*[contains(@class,' topic/vrm ')]/@version" mode="gen-metadata">
  357. <meta name="version" content="{.}"/>
  358. <xsl:value-of select="$newline"/>
  359. </xsl:template>
  360. <xsl:template match="*[contains(@class,' topic/vrm ')]/@release" mode="gen-metadata">
  361. <meta name="release" content="{.}"/>
  362. <xsl:value-of select="$newline"/>
  363. </xsl:template>
  364. <xsl:template match="*[contains(@class,' topic/vrm ')]/@modification" mode="gen-metadata">
  365. <meta name="modification" content="{.}"/>
  366. <xsl:value-of select="$newline"/>
  367. </xsl:template>
  368. <xsl:template match="*[contains(@class,' topic/brand ')]" mode="gen-metadata">
  369. <xsl:variable name="brandmeta">
  370. <xsl:apply-templates select="*|text()" mode="text-only"/>
  371. </xsl:variable>
  372. <meta name="brand">
  373. <xsl:attribute name="content"><xsl:value-of select="normalize-space($brandmeta)"/></xsl:attribute>
  374. </meta>
  375. <xsl:value-of select="$newline"/>
  376. </xsl:template>
  377. <xsl:template match="*[contains(@class,' topic/component ')]" mode="gen-metadata">
  378. <xsl:variable name="componentmeta">
  379. <xsl:apply-templates select="*|text()" mode="text-only"/>
  380. </xsl:variable>
  381. <meta name="component">
  382. <xsl:attribute name="content"><xsl:value-of select="normalize-space($componentmeta)"/></xsl:attribute>
  383. </meta>
  384. <xsl:value-of select="$newline"/>
  385. </xsl:template>
  386. <xsl:template match="*[contains(@class,' topic/featnum ')]" mode="gen-metadata">
  387. <xsl:variable name="featnummeta">
  388. <xsl:apply-templates select="*|text()" mode="text-only"/>
  389. </xsl:variable>
  390. <meta name="featnum">
  391. <xsl:attribute name="content"><xsl:value-of select="normalize-space($featnummeta)"/></xsl:attribute>
  392. </meta>
  393. <xsl:value-of select="$newline"/>
  394. </xsl:template>
  395. <xsl:template match="*[contains(@class,' topic/prognum ')]" mode="gen-metadata">
  396. <xsl:variable name="prognummeta">
  397. <xsl:apply-templates select="*|text()" mode="text-only"/>
  398. </xsl:variable>
  399. <meta name="prognum">
  400. <xsl:attribute name="content"><xsl:value-of select="normalize-space($prognummeta)"/></xsl:attribute>
  401. </meta>
  402. <xsl:value-of select="$newline"/>
  403. </xsl:template>
  404. <xsl:template match="*[contains(@class,' topic/platform ')]" mode="gen-metadata">
  405. <xsl:variable name="platformmeta">
  406. <xsl:apply-templates select="*|text()" mode="text-only"/>
  407. </xsl:variable>
  408. <meta name="platform">
  409. <xsl:attribute name="content"><xsl:value-of select="normalize-space($platformmeta)"/></xsl:attribute>
  410. </meta>
  411. <xsl:value-of select="$newline"/>
  412. </xsl:template>
  413. <xsl:template match="*[contains(@class,' topic/series ')]" mode="gen-metadata">
  414. <xsl:variable name="seriesmeta">
  415. <xsl:apply-templates select="*|text()" mode="text-only"/>
  416. </xsl:variable>
  417. <meta name="series">
  418. <xsl:attribute name="content"><xsl:value-of select="normalize-space($seriesmeta)"/></xsl:attribute>
  419. </meta>
  420. <xsl:value-of select="$newline"/>
  421. </xsl:template>
  422. <!-- INSTANTIATION: Date - prolog/critdates/created -->
  423. <xsl:template match="*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/created ')]" mode="gen-metadata">
  424. <meta name="DC.Date.Created" content="{@date}"/>
  425. <xsl:value-of select="$newline"/>
  426. </xsl:template>
  427. <!-- prolog/critdates/revised/@modified -->
  428. <xsl:template match="*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/revised ')]/@modified" mode="gen-metadata">
  429. <meta name="DC.Date.Modified" content="{.}"/>
  430. <xsl:value-of select="$newline"/>
  431. </xsl:template>
  432. <!-- prolog/critdates/revised/@golive -->
  433. <xsl:template match="*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/revised ')]/@golive" mode="gen-metadata">
  434. <meta name="DC.Date.Issued" content="{.}"/>
  435. <xsl:value-of select="$newline"/>
  436. <meta name="DC.Date.Available" content="{.}"/>
  437. <xsl:value-of select="$newline"/>
  438. </xsl:template>
  439. <!-- prolog/critdates/revised/@expiry -->
  440. <xsl:template match="*[contains(@class,' topic/critdates ')]/*[contains(@class,' topic/revised ')]/@expiry" mode="gen-metadata">
  441. <meta name="DC.Date.Expiry" content="{.}"/>
  442. <xsl:value-of select="$newline"/>
  443. </xsl:template>
  444. <!-- prolog/metadata/othermeta -->
  445. <xsl:template match="*[contains(@class,' topic/othermeta ')]" mode="gen-metadata">
  446. <meta name="{@name}" content="{@content}"/>
  447. <xsl:value-of select="$newline"/>
  448. </xsl:template>
  449. <!-- INSTANTIATION: Format -->
  450. <!-- this value is based on output format used for DC indexing, not source.
  451. Put in this odd template for easy overriding, if creating another output format. -->
  452. <xsl:template match="*" mode="gen-format-metadata">
  453. <meta name="DC.Format" content="XHTML"/>
  454. <xsl:value-of select="$newline"/>
  455. </xsl:template>
  456. <!-- INSTANTIATION: Identifier --> <!-- id is an attribute on Topic -->
  457. <xsl:template match="@id" mode="gen-metadata">
  458. <meta name="DC.Identifier" content="{.}"/>
  459. <xsl:value-of select="$newline"/>
  460. </xsl:template>
  461. <!-- INSTANTIATION: Language -->
  462. <!-- ideally, take the first token of the language attribute value -->
  463. <xsl:template match="@xml:lang" mode="gen-metadata">
  464. <meta name="DC.Language" content="{.}"/>
  465. <xsl:value-of select="$newline"/>
  466. </xsl:template>
  467. </xsl:stylesheet>