functions.xsl 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- This file is part of the DITA Open Toolkit project.
  3. See the accompanying license.txt file for applicable licenses. -->
  4. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  5. xmlns:xs="http://www.w3.org/2001/XMLSchema"
  6. xmlns:dita-ot="http://dita-ot.sourceforge.net/ns/201007/dita-ot"
  7. xmlns:table="http://dita-ot.sourceforge.net/ns/201007/dita-ot/table"
  8. xmlns:simpletable="http://dita-ot.sourceforge.net/ns/201007/dita-ot/simpletable"
  9. version="2.0"
  10. exclude-result-prefixes="xs dita-ot table">
  11. <xsl:variable name="HTML_ID_SEPARATOR" select="'__'"/>
  12. <xsl:function name="dita-ot:generate-html-id" as="xs:string">
  13. <xsl:param name="element" as="element()"/>
  14. <xsl:sequence
  15. select="if (exists($element/@id))
  16. then dita-ot:get-prefixed-id($element, $element/@id)
  17. else dita-ot:generate-stable-id($element)"/>
  18. </xsl:function>
  19. <xsl:function name="dita-ot:generate-id" as="xs:string">
  20. <xsl:param name="topic" as="xs:string?"/>
  21. <xsl:param name="element" as="xs:string?"/>
  22. <xsl:value-of select="string-join(($topic, $element), $HTML_ID_SEPARATOR)"/>
  23. </xsl:function>
  24. <xsl:function name="dita-ot:get-prefixed-id" as="xs:string">
  25. <xsl:param name="element" as="element()"/>
  26. <xsl:param name="id" as="xs:string"/>
  27. <xsl:sequence select="dita-ot:generate-id($element/ancestor::*[contains(@class, ' topic/topic ')][1]/@id, $id)"/>
  28. </xsl:function>
  29. <xsl:function name="dita-ot:generate-stable-id" as="xs:string">
  30. <xsl:param name="element" as="element()"/>
  31. <xsl:variable name="topic" select="$element/ancestor-or-self::*[contains(@class, ' topic/topic ')][1]" as="element()"/>
  32. <xsl:variable name="parent-element" select="$element/ancestor-or-self::*[@id][1][not(. is $topic)]" as="element()?"/>
  33. <xsl:variable name="closest" select="($parent-element, $topic)[1]" as="element()"/>
  34. <xsl:variable name="index" select="count($closest/descendant::*[local-name() = local-name($element)][. &lt;&lt; $element]) + 1" as="xs:integer"/>
  35. <xsl:sequence select="dita-ot:generate-id($topic/@id, string-join(($parent-element/@id, local-name($element), string($index)), $HTML_ID_SEPARATOR))"/>
  36. </xsl:function>
  37. <xsl:function name="table:is-tbody-entry" as="xs:boolean">
  38. <xsl:param name="el" as="element()"/>
  39. <xsl:sequence select="
  40. contains($el/@class, ' topic/entry ') and contains($el/../../@class, ' topic/tbody ')
  41. "/>
  42. </xsl:function>
  43. <xsl:function name="table:is-thead-entry" as="xs:boolean">
  44. <xsl:param name="el" as="element()"/>
  45. <xsl:sequence select="
  46. contains($el/@class, ' topic/entry ') and contains($el/../../@class, ' topic/thead ')
  47. "/>
  48. </xsl:function>
  49. <xsl:function name="table:get-current-table" as="element()">
  50. <xsl:param name="node" as="node()"/>
  51. <xsl:sequence select="
  52. $node/ancestor-or-self::*[contains(@class, ' topic/table ')][1]
  53. "/>
  54. </xsl:function>
  55. <xsl:function name="table:get-current-tgroup" as="element()">
  56. <xsl:param name="node" as="node()"/>
  57. <xsl:sequence select="
  58. $node/ancestor-or-self::*[contains(@class, ' topic/tgroup ')][1]
  59. "/>
  60. </xsl:function>
  61. <xsl:function name="table:is-row-header" as="xs:boolean">
  62. <xsl:param name="entry" as="element()"/>
  63. <xsl:sequence select="
  64. table:get-current-table($entry)/@rowheader eq 'firstcol'
  65. and xs:integer($entry/@dita-ot:x) eq 1
  66. "/>
  67. </xsl:function>
  68. <xsl:function name="table:get-entry-colspec" as="element()">
  69. <xsl:param name="entry" as="element()"/>
  70. <xsl:sequence select="
  71. table:get-current-table($entry)/*/*[contains(@class, ' topic/colspec ')]
  72. [@colname eq $entry/@colname]
  73. "/>
  74. </xsl:function>
  75. <xsl:function name="table:get-entry-align" as="attribute(align)?">
  76. <xsl:param name="el" as="element()"/>
  77. <xsl:sequence select="
  78. ($el/@align,
  79. table:get-current-tgroup($el)/@align,
  80. table:get-entry-colspec($el)/@align)[1]
  81. "/>
  82. </xsl:function>
  83. <xsl:function name="table:get-entry-colsep" as="attribute(colsep)?">
  84. <xsl:param name="el" as="element()"/>
  85. <xsl:sequence select="
  86. ($el/@colsep,
  87. table:get-entry-colspec($el)/@colsep,
  88. table:get-current-table($el)/@colsep,
  89. table:get-current-tgroup($el)/@colsep)[1]
  90. "/>
  91. </xsl:function>
  92. <xsl:function name="table:get-entry-rowsep" as="attribute(rowsep)?">
  93. <xsl:param name="el" as="element()"/>
  94. <xsl:sequence select="
  95. ($el/@rowsep,
  96. table:get-entry-colspec($el)/@rowsep,
  97. table:get-current-table($el)/@rowsep,
  98. table:get-current-tgroup($el)/@rowsep)[1]
  99. "/>
  100. </xsl:function>
  101. <xsl:function name="simpletable:is-body-entry" as="xs:boolean">
  102. <xsl:param name="el" as="element()"/>
  103. <xsl:sequence select="
  104. contains($el/@class, ' topic/stentry ') and contains($el/../@class, ' topic/strow ')
  105. "/>
  106. </xsl:function>
  107. <xsl:function name="simpletable:is-head-entry" as="xs:boolean">
  108. <xsl:param name="el" as="element()"/>
  109. <xsl:sequence select="
  110. contains($el/@class, ' topic/stentry ') and contains($el/../@class, ' topic/sthead ')
  111. "/>
  112. </xsl:function>
  113. <xsl:function name="simpletable:get-current-table" as="element()">
  114. <xsl:param name="node" as="node()"/>
  115. <xsl:sequence select="
  116. $node/ancestor-or-self::*[contains(@class, ' topic/simpletable ')][1]
  117. "/>
  118. </xsl:function>
  119. <xsl:function name="simpletable:is-keycol-entry" as="xs:boolean">
  120. <xsl:param name="entry" as="element()"/>
  121. <xsl:variable name="table" as="element()"
  122. select="simpletable:get-current-table($entry)"/>
  123. <xsl:sequence select="
  124. $table/@keycol and xs:integer($table/@keycol) eq count($entry/preceding-sibling::*) + 1
  125. "/>
  126. </xsl:function>
  127. </xsl:stylesheet>