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

Untitled

By: a guest on May 5th, 2012  |  syntax: None  |  size: 6.42 KB  |  hits: 13  |  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 get some documents from one xml
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <document>
  4.     <line id="0">
  5.         <Info><![CDATA[Header]]></Info>
  6.         <documentNUM><![CDATA[DOC1]]></documentNUM>
  7.         <Code><![CDATA[AS22]]></Code>
  8.     </line>
  9.     <line id="1">
  10.         <Info><![CDATA[Line]]></Info>
  11.         <Position><![CDATA[1]]></Position>
  12.         <Number><![CDATA[7361]]></Number>
  13.     </line>
  14.     <line id="2">
  15.         <Info><![CDATA[Line]]></Info>
  16.         <Position><![CDATA[2]]></Position>
  17.         <Number><![CDATA[7362]]></Number>
  18.     </line>    
  19.     <line id="3">
  20.         <Info><![CDATA[Header]]></Info>
  21.         <documentNUM><![CDATA[DOC2]]></documentNUM>
  22.         <Code><![CDATA[AS22]]></Code>
  23.     </line>
  24.     <line id="4">
  25.         <Info><![CDATA[Line]]></Info>
  26.         <Position><![CDATA[1]]></Position>
  27.         <Number><![CDATA[3623]]></Number>
  28.     </line>
  29.     <line id="5">
  30.         <Info><![CDATA[Header]]></Info>
  31.         <documentNUM><![CDATA[DOC1]]></documentNUM>
  32.         <Code><![CDATA[AS22]]></Code>
  33.     </line>
  34.     <line id="6">
  35.         <Info><![CDATA[Line]]></Info>
  36.         <Position><![CDATA[1]]></Position>
  37.         <Number><![CDATA[3623]]></Number>
  38.     </line>
  39. </document>
  40.        
  41. <xsl:key name="kNext" match="line[starts-with(Info,'H')]" use="concat(starts-with(Info,'H'), '+', documentNUM)"/>
  42.        
  43. <result>
  44.     <Group>
  45.         <Message>
  46.             <document>
  47.                 <documentNUM>DOC1</documentNUM>
  48.                 <Lines>
  49.                     <Line>
  50.                         <LineNumber>1</LineNumber>
  51.                         <Number>7361</Number>
  52.                         <Code>AS22</Code>
  53.                     </Line>
  54.                     <Line>
  55.                         <LineNumber>2</LineNumber>
  56.                         <Number>7362</Number>
  57.                         <Code>AS22</Code>
  58.                     </Line>
  59.                     <Line>
  60.                         <LineNumber>3</LineNumber>
  61.                         <Number>3623</Number>
  62.                         <Code>AS22</Code>
  63.                     </Line>
  64.                 </Lines>
  65.             </document>
  66.         </Message>
  67.     </Group>
  68.     <Group>
  69.         <Message>
  70.             <document>
  71.                 <documentNUM>DOC2</documentNUM>
  72.             </document>
  73.                     <Line>
  74.                         <LineNumber>1</LineNumber>
  75.                         <Number>3623</Number>
  76.                         <Code>AS22</Code>
  77.                     </Line>
  78.                 </Lines>
  79.         </Message>
  80.     </Group>
  81. </result>
  82.        
  83. <xsl:stylesheet version="1.0"
  84.  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  85.  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  86.  
  87.  <xsl:key name="kFollowing" match="line[not(documentNUM)]"
  88.   use="generate-id(preceding-sibling::line
  89.                                [documentNUM]
  90.                                           [1]
  91.                   )"/>
  92.  
  93.  <xsl:key name="kLineByDocNum" match="line"
  94.   use="documentNUM"/>
  95.  
  96.  <xsl:template match=
  97.   "line
  98.      [documentNUM
  99.     and
  100.       generate-id()
  101.      =
  102.       generate-id(key('kLineByDocNum', documentNUM)[1])
  103.      ]">
  104.    <Group>
  105.     <Message>
  106.       <document>
  107.         <documentNUM>
  108.           <xsl:value-of select="documentNUM"/>
  109.         </documentNUM>
  110.         <Lines>
  111.           <xsl:apply-templates mode="inGroup" select=
  112.           "key('kLineByDocNum', documentNUM)"/>
  113.         </Lines>
  114.       </document>
  115.     </Message>
  116.    </Group>
  117.  </xsl:template>
  118.  
  119.  <xsl:template match="line" mode="inGroup">
  120.   <xsl:apply-templates mode="inGroup2"
  121.   select="key('kFollowing', generate-id())">
  122.   <xsl:with-param name="pCode" select="Code"/>
  123.   </xsl:apply-templates>
  124.  </xsl:template>
  125.  
  126.  <xsl:template match="line" mode="inGroup2">
  127.   <xsl:param name="pCode"/>
  128.  
  129.   <xsl:variable name="vcurDocNum" select=
  130.   "preceding-sibling::line
  131.             [documentNUM][1]
  132.                   /documentNUM
  133.   "/>
  134.   <xsl:variable name="vPos" select=
  135.   "count(preceding-sibling::line
  136.                 [not(documentNUM)]
  137.                   [preceding-sibling::line
  138.                      [documentNUM][1]
  139.                          /documentNUM
  140.                   =
  141.                    $vcurDocNum
  142.                   ]
  143.         ) +1"/>
  144.   <Line>
  145.     <LineNumber><xsl:value-of select="$vPos"/></LineNumber>
  146.     <xsl:copy-of select="Number"/>
  147.     <Code><xsl:value-of select="$pCode"/></Code>
  148.   </Line>
  149.  </xsl:template>
  150.  <xsl:template match="text()"/>
  151. </xsl:stylesheet>
  152.        
  153. <document>
  154.     <line id="0">
  155.         <Info>Header</Info>
  156.         <documentNUM>DOC1</documentNUM>
  157.         <Code>AS22</Code>
  158.     </line>
  159.     <line id="1">
  160.         <Info>Line</Info>
  161.         <Position>1</Position>
  162.         <Number>7361</Number>
  163.     </line>
  164.     <line id="2">
  165.         <Info>Line</Info>
  166.         <Position>2</Position>
  167.         <Number>7362</Number>
  168.     </line>
  169.     <line id="3">
  170.         <Info>Header</Info>
  171.         <documentNUM>DOC2</documentNUM>
  172.         <Code>AS22</Code>
  173.     </line>
  174.     <line id="4">
  175.         <Info>Line</Info>
  176.         <Position>1</Position>
  177.         <Number>3623</Number>
  178.     </line>
  179.     <line id="5">
  180.         <Info>Header</Info>
  181.         <documentNUM>DOC1</documentNUM>
  182.         <Code>AS22</Code>
  183.     </line>
  184.     <line id="6">
  185.         <Info>Line</Info>
  186.         <Position>1</Position>
  187.         <Number>3623</Number>
  188.     </line>
  189. </document>
  190.        
  191. <Group>
  192.    <Message>
  193.       <document>
  194.          <documentNUM>DOC1</documentNUM>
  195.          <Lines>
  196.             <Line>
  197.                <LineNumber>1</LineNumber>
  198.                <Number>7361</Number>
  199.                <Code>AS22</Code>
  200.             </Line>
  201.             <Line>
  202.                <LineNumber>2</LineNumber>
  203.                <Number>7362</Number>
  204.                <Code>AS22</Code>
  205.             </Line>
  206.             <Line>
  207.                <LineNumber>3</LineNumber>
  208.                <Number>3623</Number>
  209.                <Code>AS22</Code>
  210.             </Line>
  211.          </Lines>
  212.       </document>
  213.    </Message>
  214. </Group>
  215. <Group>
  216.    <Message>
  217.       <document>
  218.          <documentNUM>DOC2</documentNUM>
  219.          <Lines>
  220.             <Line>
  221.                <LineNumber>1</LineNumber>
  222.                <Number>3623</Number>
  223.                <Code>AS22</Code>
  224.             </Line>
  225.          </Lines>
  226.       </document>
  227.    </Message>
  228. </Group>
  229.        
  230. <result>
  231.   <xsl:for-each-group select="line"
  232.        group-starting-with="line[starts-with(Info,'H')]">
  233.     <Group>
  234.       <Message>
  235.         <document>
  236.           <documentNUM>
  237.             <xsl:value-of select="current-grouping-key()/documentNUM" />
  238.           </documentNUM>
  239.         </document>
  240.         <xsl:apply-templates select="current-group()
  241.                           [not(starts-with(Info, 'H'))]" />