Guest User

Untitled

a guest
Jul 24th, 2012
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.06 KB | None | 0 0
  1. How to split delimited string to XML node Tree
  2. heading1_sub1_element1 = data1
  3. heading1_sub1_element2 = data2
  4. heading1_sub1_element3 = data3
  5. heading1_sub2_element1 = data4
  6. heading1_sub2_element2 = data5
  7. heading1_sub2_element3 = data6
  8.  
  9. <table>
  10. <heading1_sub1_element1>data1</heading1_sub1_element1>
  11. <heading1_sub1_element2>data2</heading1_sub1_element2>
  12. <heading1_sub1_element3>data3</heading1_sub1_element3>
  13. <heading1_sub2_element1>data4</heading1_sub2_element1>
  14. <heading1_sub2_element2>data5</heading1_sub2_element2>
  15. <heading1_sub2_element3>data6</heading1_sub2_element3>
  16. </table>
  17.  
  18. <heading1>
  19. <sub1>
  20. <element1>Data1</element1>
  21. <element2>Data2</element2>
  22. <element3>Data3</element3>
  23. </sub1>
  24. <sub2>
  25. <element1>Data4</element1>
  26. <element2>Data5</element2>
  27. <element3>Data6</element3>
  28. </sub2>
  29. </heading1>
  30.  
  31. <xsl:stylesheet version="2.0"
  32. xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  33. xmlns:xs="http://www.w3.org/2001/XMLSchema"
  34. xmlns:my="my:my" exclude-result-prefixes="my xs">
  35. <xsl:output omit-xml-declaration="yes" indent="yes"/>
  36.  
  37. <xsl:variable name="vLines" select="tokenize(/*, 'r?n')[.]"/>
  38.  
  39. <xsl:variable name="vPass1">
  40. <t>
  41. <xsl:apply-templates mode="pass1"/>
  42. </t>
  43. </xsl:variable>
  44.  
  45.  
  46. <xsl:template match="/*" mode="pass1">
  47. <xsl:for-each select="$vLines">
  48. <xsl:sequence select="my:makeTree(normalize-space(.))"/>
  49. </xsl:for-each>
  50. </xsl:template>
  51.  
  52. <xsl:template match="/">
  53. <xsl:apply-templates select="$vPass1" mode="pass2"/>
  54. </xsl:template>
  55.  
  56. <xsl:function name="my:makeTree">
  57. <xsl:param name="pLine"/>
  58.  
  59. <xsl:variable name="vName" select="substring-before($pLine, '_')"/>
  60.  
  61. <xsl:choose>
  62. <xsl:when test="$vName">
  63. <xsl:element name="{$vName}">
  64. <xsl:sequence select="my:makeTree(substring-after($pLine, '_'))"/>
  65. </xsl:element>
  66. </xsl:when>
  67. <xsl:otherwise>
  68. <xsl:element name=
  69. "{normalize-space(substring-before($pLine, '='))}">
  70. <xsl:sequence select="substring-after($pLine, '=')"/>
  71. </xsl:element>
  72. </xsl:otherwise>
  73. </xsl:choose>
  74. </xsl:function>
  75.  
  76. <xsl:function name="my:group">
  77. <xsl:param name="pNodes" as="node()*"/>
  78.  
  79. <xsl:for-each-group select="$pNodes[self::*]" group-by="name()">
  80. <xsl:element name="{name()}">
  81. <xsl:for-each select="current-group()">
  82. <xsl:sequence select="my:group(node())"/>
  83. </xsl:for-each>
  84. </xsl:element>
  85. </xsl:for-each-group>
  86. <xsl:copy-of select="$pNodes[not(self::*)]"/>
  87. </xsl:function>
  88.  
  89. <xsl:template match="*[not(my:path(.) = preceding::*/my:path(.))]" mode="pass2">
  90. <xsl:copy>
  91. <xsl:apply-templates select="//*[my:path(.) = my:path((current()))]/node()"
  92. mode="pass2"/>
  93. </xsl:copy>
  94. </xsl:template>
  95.  
  96. <xsl:template match="*" mode="pass2"/>
  97.  
  98. <xsl:template match="/*" mode="pass2" priority="3">
  99. <xsl:apply-templates mode="pass2"/>
  100. </xsl:template>
  101.  
  102. <xsl:function name="my:path" as="xs:string">
  103. <xsl:param name="pElement" as="element()"/>
  104.  
  105. <xsl:sequence select=
  106. "string-join($pElement/ancestor-or-self::*/name(.), '/')"/>
  107. </xsl:function>
  108.  
  109. </xsl:stylesheet>
  110.  
  111. <t>
  112. heading1_sub1_element1 = data1
  113. heading1_sub1_element2 = data2
  114. heading1_sub1_element3 = data3
  115. heading1_sub2_element1 = data4
  116. heading1_sub2_element2 = data5
  117. heading1_sub2_element3 = data6
  118. </t>
  119.  
  120. <heading1>
  121. <sub1>
  122. <element1> data1</element1>
  123. <element2> data2</element2>
  124. <element3> data3</element3>
  125. </sub1>
  126. <sub2>
  127. <element1> data4</element1>
  128. <element2> data5</element2>
  129. <element3> data6</element3>
  130. </sub2>
  131. </heading1>
  132.  
  133. <t>
  134. heading1_sub1_element1 = data1
  135. heading1_sub1_element2 = data2
  136. heading1_sub1_element3 = data3
  137. heading1_sub2_element1 = data4
  138. heading1_sub2_element2 = data5
  139. heading1_sub2_element3 = data6
  140. heading2_sub1_sub2_sub3 = data7
  141. heading2_sub1_sub2_sub3_sub4 = data8
  142. heading2_sub1_sub2 = data9
  143. heading2_sub1 = data10
  144. heading2_sub1_sub2_sub3 = data11
  145. </t>
  146.  
  147. <heading1>
  148. <sub1>
  149. <element1> data1</element1>
  150. <element2> data2</element2>
  151. <element3> data3</element3>
  152. </sub1>
  153. <sub2>
  154. <element1> data4</element1>
  155. <element2> data5</element2>
  156. <element3> data6</element3>
  157. </sub2>
  158. </heading1>
  159. <heading2>
  160. <sub1>
  161. <sub2>
  162. <sub3>
  163. data7
  164. <sub4> data8</sub4>
  165. data11
  166. </sub3>
  167. data9
  168. </sub2>
  169. data10
  170. </sub1>
  171. </heading2>
  172.  
  173. <t>
  174. <heading1>
  175. <sub1>
  176. <element1> data1</element1>
  177. </sub1>
  178. </heading1>
  179. <heading1>
  180. <sub1>
  181. <element2> data2</element2>
  182. </sub1>
  183. </heading1>
  184. <heading1>
  185. <sub1>
  186. <element3> data3</element3>
  187. </sub1>
  188. </heading1>
  189. <heading1>
  190. <sub2>
  191. <element1> data4</element1>
  192. </sub2>
  193. </heading1>
  194. <heading1>
  195. <sub2>
  196. <element2> data5</element2>
  197. </sub2>
  198. </heading1>
  199. <heading1>
  200. <sub2>
  201. <element3> data6</element3>
  202. </sub2>
  203. </heading1>
  204. </t>
  205.  
  206. $vals = explode("_", $string_input);
  207.  
  208. $vals[0] = "heading1";
  209. $vals[1] = "sub1";
  210. $vals[2] = "element1";
Advertisement
Add Comment
Please, Sign In to add comment