str.find-last.xslt 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--
  3. This stylesheet originates from the sample code published with the following book:
  4. Author: Sal Mangano
  5. Title: XSLT Cookbook
  6. Publisher: O'Reilly & Associates, Inc.
  7. ISBN 10: 0-596-00372-2
  8. ISBN 13: 9780596003722
  9. http://www.oreilly.com/catalog/xsltckbk
  10. examples: http://examples.oreilly.com/xsltckbk/
  11. Conditions on re-using the sample code:
  12. "
  13. Unless there is a specific prohibition on a book's catalog page,
  14. we put programming examples online to be used.
  15. The source of the code should be noted in any documentation
  16. and as a comment in the program itself.
  17. The attribution should include author, title, publisher, and ISBN.
  18. For further information, see our
  19. Policy on Re-Use of Code Examples: http://www.oreilly.com/pub/a/oreilly/ask_tim/2001/codepolicy.html.
  20. "
  21. -->
  22. <xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" id="str.find-last"
  23. xmlns:str="http://www.ora.com/XSLTCookbook/namespaces/strings" extension-element-prefixes="str">
  24. <xsl:template name="str:substring-before-last">
  25. <xsl:param name="input"/>
  26. <xsl:param name="substr"/>
  27. <xsl:if test="$substr and contains($input, $substr)">
  28. <xsl:variable name="temp" select="substring-after($input, $substr)" />
  29. <xsl:value-of select="substring-before($input, $substr)" />
  30. <xsl:if test="contains($temp, $substr)">
  31. <xsl:value-of select="$substr" />
  32. <xsl:call-template name="str:substring-before-last">
  33. <xsl:with-param name="input" select="$temp" />
  34. <xsl:with-param name="substr" select="$substr" />
  35. </xsl:call-template>
  36. </xsl:if>
  37. </xsl:if>
  38. </xsl:template>
  39. <xsl:template name="str:substring-after-last">
  40. <xsl:param name="input"/>
  41. <xsl:param name="substr"/>
  42. <!-- Extract the string which comes after the first occurence -->
  43. <xsl:variable name="temp" select="substring-after($input,$substr)"/>
  44. <xsl:choose>
  45. <xsl:when test="$substr and contains($temp,$substr)">
  46. <xsl:call-template name="str:substring-after-last">
  47. <xsl:with-param name="input" select="$temp"/>
  48. <xsl:with-param name="substr" select="$substr"/>
  49. </xsl:call-template>
  50. </xsl:when>
  51. <xsl:otherwise>
  52. <xsl:value-of select="$temp"/>
  53. </xsl:otherwise>
  54. </xsl:choose>
  55. </xsl:template>
  56. <xsl:template match="xsl:stylesheet[@id='str.find-last'] | xsl:include[@href='str.find-last.xslt'] " >
  57. <tests>
  58. <!-- before -->
  59. <test name="str:substring-before-last with no occurences of yes">
  60. <xsl:call-template name="str:substring-before-last">
  61. <xsl:with-param name="input" select=" 'No occurences' "/>
  62. <xsl:with-param name="substr" select=" 'yes' "/>
  63. </xsl:call-template>
  64. </test>
  65. <test name="str:substring-before-last starts with yes">
  66. <xsl:call-template name="str:substring-before-last">
  67. <xsl:with-param name="input" select=" 'yes occurences' "/>
  68. <xsl:with-param name="substr" select=" 'yes' "/>
  69. </xsl:call-template>
  70. </test>
  71. <test name="str:substring-before-last starts with yes and ends with yes">
  72. <xsl:call-template name="str:substring-before-last">
  73. <xsl:with-param name="input" select=" 'yes occurences yes' "/>
  74. <xsl:with-param name="substr" select=" 'yes' "/>
  75. </xsl:call-template>
  76. </test>
  77. <test name="str:substring-before-last 3 yes">
  78. <xsl:call-template name="str:substring-before-last">
  79. <xsl:with-param name="input" select=" 'yesyesyes' "/>
  80. <xsl:with-param name="substr" select=" 'yes' "/>
  81. </xsl:call-template>
  82. </test>
  83. <test name="str:substring-before-last empty input">
  84. <xsl:call-template name="str:substring-before-last">
  85. <xsl:with-param name="substr" select=" 'yes' "/>
  86. </xsl:call-template>
  87. </test>
  88. <test name="str:substring-before-last empty search">
  89. <xsl:call-template name="str:substring-before-last">
  90. <xsl:with-param name="input" select=" 'No occurences' "/>
  91. </xsl:call-template>
  92. </test>
  93. <test name="str:substring-before-last large">
  94. <xsl:call-template name="str:substring-before-last">
  95. <xsl:with-param name="input" select=" 'yesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyesyes' "/>
  96. <xsl:with-param name="substr" select=" 'yes' "/>
  97. </xsl:call-template>
  98. </test>
  99. <!-- after -->
  100. <test name="str:substring-after-last with no occurences of yes">
  101. <xsl:call-template name="str:substring-after-last">
  102. <xsl:with-param name="input" select=" 'No occurences' "/>
  103. <xsl:with-param name="substr" select=" 'yes' "/>
  104. </xsl:call-template>
  105. </test>
  106. <test name="str:substring-after-last starts with yes">
  107. <xsl:call-template name="str:substring-after-last">
  108. <xsl:with-param name="input" select=" 'yes occurences' "/>
  109. <xsl:with-param name="substr" select=" 'yes' "/>
  110. </xsl:call-template>
  111. </test>
  112. <test name="str:substring-after-last starts with yes and ends with yes">
  113. <xsl:call-template name="str:substring-after-last">
  114. <xsl:with-param name="input" select=" 'yes occurences yes' "/>
  115. <xsl:with-param name="substr" select=" 'yes' "/>
  116. </xsl:call-template>
  117. </test>
  118. <test name="str:substring-after-last 3 yes">
  119. <xsl:call-template name="str:substring-after-last">
  120. <xsl:with-param name="input" select=" 'yesyesyes' "/>
  121. <xsl:with-param name="substr" select=" 'yes' "/>
  122. </xsl:call-template>
  123. </test>
  124. <test name="str:substring-after-last 3 yes then no">
  125. <xsl:call-template name="str:substring-after-last">
  126. <xsl:with-param name="input" select=" 'yesyesyesno' "/>
  127. <xsl:with-param name="substr" select=" 'yes' "/>
  128. </xsl:call-template>
  129. </test>
  130. <test name="str:substring-after-last empty input">
  131. <xsl:call-template name="str:substring-after-last">
  132. <xsl:with-param name="substr" select=" 'yes' "/>
  133. </xsl:call-template>
  134. </test>
  135. <test name="str:substring-after-last empty search">
  136. <xsl:call-template name="str:substring-after-last">
  137. <xsl:with-param name="input" select=" 'No occurences' "/>
  138. </xsl:call-template>
  139. </test>
  140. </tests>
  141. </xsl:template>
  142. <!--xsl:template match="text()"/-->
  143. </xsl:stylesheet>