Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 24th, 2012  |  syntax: None  |  size: 5.06 KB  |  hits: 9  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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";