xml - Muenchian विधि का उपयोग कर एकाधिक कुंजी पर XSLT समूह



xslt-1.0 xslt-grouping (1)

यह इनपुट फ़ाइल है

ये सभी ब्लॉकों एक <allocfile> टैग में लिपटे हैं जो दिखाई नहीं दे रहा है, क्यों नहीं <allocfile> ? और ये सभी ब्लॉकों शीर्ष स्तर तत्व <xml> में लपेटे गए हैं

<XML>
  <AllocFile>
    <alc>1</alc>
    <No>11/10</No>
    <DT>20090401</DT> 
    <G_H>147</G_H>
    <FUN>125487</FUN>
    <oH>11</oH>
    <y>9</y>
    <AMOUNT>8000000</AMOUNT>
    <Code>033195</Code>
    <hd1>1234</hd1>
  </AllocFile>
  <AllocFile>
    <alc>2</alc>
    <No>14/10</No>
    <DT>20090401</DT>
    <G_H>147</G_H>
    <FUN>125487</FUN>
    <oH>11</oH>
    <y>9</y>
    <AMOUNT>8400000</AMOUNT>
    <Code>033195</Code>
    <hd1>1234</hd1>
  </AllocFile>
  <AllocFile>
    <alc>3</alc>
    <No>74/10</No>
    <DT>20090401</DT>
    <G_H>147</G_H>
    <FUN>125487</FUN>
    <oH>11</oH>
    <y>9</y>
    <AMOUNT>8740000</AMOUNT>
    <Code>033195</Code>
    <hd1>1234</hd1>
  </AllocFile>
  <AllocFile>
    <alc>2</alc>
    <No>74/10</No>
    <DT>20090401</DT>
    <G_H>117</G_H>
    <FUN>125487</FUN>
    <oH>19</oH>
    <y>9</y>
    <AMOUNT>74512</AMOUNT>
    <Code>033118</Code>
    <hd1>1234</hd1>
  </AllocFile>
  <AllocFile>
    <alc>3</alc>
    <No>14/10</No>
    <DT>20090401</DT>
    <G_H>117</G_H>
    <FUN>125487</FUN>
    <oH>19</oH>
    <y>9</y>
    <AMOUNT>986541</AMOUNT>
    <Code>033147</Code>
    <hd1>1234</hd1>
  </AllocFile> 
</XML>

आउटपुट है

<Header1>
  <Hd1>1234</Hd1>
  <CodeHeader>
    <Code>033195</Code>
    <Header2>
      <G_H>147</G_H>
      <FUN>125487</FUN>
      <oH>11</oH>
      <y>9</y>
      <allocheader>
        <alc>1</alc>
        <No>11/10</No>
        <DT>20090401</DT>
        <AMOUNT>8000000</AMOUNT>
      </allocheader>
      <allocheader>
        <alc>2</alc>
        <No>14/10</No>
        <DT>20090401</DT>
        <AMOUNT>8400000</AMOUNT>
      </allocheader>
      <allocheader>
        <alc>3</alc>
        <No>74/10</No>
        <DT>20090401</DT>
        <AMOUNT>8740000</AMOUNT>
      </allocheader>
    </Header2>
  </CodeHeader>
  <CodeHeader>
        <Code>033118</Code>
        <Header2>
      <G_H>117</G_H>
      <FUN>125487</FUN>
         <oH>19</oH>
            <y>9</y>
             <allocheader>
             <alc>2</alc>
             <No>74/10</No>
             <DT>20090401</DT>
             <AMOUNT>74512</AMOUNT>
           </allocheader>
       </Header2>
    </codeHeader>
   <CodeHeader>
        <Code>033147</Code>
           <Header2>
          <G_H>117</G_H>
          <FUN>125487</FUN>
          <oH>19</oH>
          <y>9</y>
         <allocheader>
           <alc>3</alc>
            <No>14/10</No>
            <DT>20090401</DT>
            <AMOUNT>986541</AMOUNT>
          </allocheader>
         </Header2>
      </CodeHeader>
</Header1>

इनपुट फ़ाइल को एकाधिक कुंजी के आधार पर क्रमबद्ध और समूहीकृत करने की आवश्यकता है। मैंने concat फ़ंक्शन और Muenchian विधि का उपयोग कर दिया लेकिन वेब से ज्यादा मदद नहीं की मैं एक्सएसएलटी 1.0 का उपयोग कर रहा हूं।

समूह के लिए नियम

  • फ़ाइल में सभी नोड्स में <hd1> 1234.. मान होंगे 1234.. यह कुंजी के पहले समूह बन जाता है और आउटपुट में <Header1> दिखाई देता है

    • ग्रुपिंग के लिए दूसरी कुंजी नोड कोड है उसी मान वाले नोड्स को एक साथ समूहित किया जाता है। के रूप में प्रकट होता है कोड हैडर
  • दूसरी कुंजी नोड्स का समूह है G_H , FUN , oH , y । यदि इन सभी नोड्स के लिए समान मान हैं, तो वे एक साथ समूहबद्ध हो जाते हैं। यह आउटपुट के रूप में <Header2> में प्रकट होता है

  • नोड्स <alc> , <No> , <DT> , <AMOUNT> पर कोई ग्रुपिंग नहीं होता है। उनके पास प्रत्येक समूह के भीतर अलग-अलग मान हैं


अगर एचडी 1 तत्व हमेशा '1234' होता है तो आप वास्तव में उनके द्वारा समूह नहीं कर रहे हैं, लेकिन अगर आप थे तो आप समान सरल कुंजी को परिभाषित करेंगे

<xsl:key name="header1" match="AllocFile" use="hd1" />

दूसरी कुंजी के लिए, आपको कोड तत्व के खाते की आवश्यकता होगी

<xsl:key name="header2" match="AllocFile" use="concat(hd1, '|', Code)" />

और फिर आखिरी कुंजी के लिए, आप सभी तत्वों से निपटने के लिए अधिक जटिल कुंजी को परिभाषित करेंगे

<xsl:key name="header3" 
   match="AllocFile" 
   use="concat(hd1 '|', Code, '|', G_H, '|', FUN, '|', oH, '|', y)" />

डीलिमीटर के रूप में 'पाइप' वर्ण का उपयोग ध्यान दें। किसी सीमांकित को चुनना महत्वपूर्ण है जिसे कभी भी चयनित तत्वों में से किसी में नहीं घटित होता है।

उसके बाद, अलग हेडर 1 तत्वों को देखने के लिए, आप उन तत्वों की खोज करेंगे जो पहले 1 शीर्ष लेख में दिखाई देते हैं

<xsl:apply-templates 
   select="AllocFile[generate-id() = generate-id(key('header1', hd1)[1])]" 
   mode="header1" />

प्रत्येक हेडर 1 तत्व में अलग कोड तत्वों को खोजने के लिए, आप निम्न कार्य करेंगे

<xsl:apply-templates 
   select="key('header1', hd1)
     [generate-id() = generate-id(key('header2', concat(hd1, '|', Code))[1])]" 
   mode="header2" /> 

अंत में, प्रत्येक कोड समूह के भीतर, अलग 'हेडर 3' तत्वों को ढूंढने के लिए, आप तीसरे कुंजी के भीतर पहले तत्वों को देखेंगे

<xsl:apply-templates 
 select="key('header2', concat(hd1, '|', Code))
    [generate-id() = 
     generate-id(key('header3', concat(hd1, '|', Code, '|', G_H, '|', FUN, '|', oH, '|', y))[1])]" 
 mode="header3" /> 

यहां पूर्ण XSLT है

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="header1" match="AllocFile" use="hd1"/>
   <xsl:key name="header2" match="AllocFile" use="concat(hd1, '|', Code)"/>
   <xsl:key name="header3" match="AllocFile" use="concat(hd1, '|', Code, '|', G_H, '|', FUN, '|', oH, '|', y)"/>

   <xsl:template match="/XML">
      <xsl:apply-templates select="AllocFile[generate-id() = generate-id(key('header1', hd1)[1])]" mode="header1"/>
   </xsl:template>

   <xsl:template match="AllocFile" mode="header1">
      <Header1>
         <Hd1>
            <xsl:value-of select="hd1"/>
         </Hd1>
         <xsl:apply-templates select="key('header1', hd1)[generate-id() = generate-id(key('header2', concat(hd1, '|', Code))[1])]" mode="header2"/>
      </Header1>
   </xsl:template>

   <xsl:template match="AllocFile" mode="header2">
      <CodeHeader>
         <xsl:copy-of select="Code"/>
         <xsl:apply-templates select="key('header2', concat(hd1, '|', Code))[generate-id() = generate-id(key('header3', concat(hd1, '|', Code, '|', G_H, '|', FUN, '|', oH, '|', y))[1])]" mode="header3"/>
      </CodeHeader>
   </xsl:template>

   <xsl:template match="AllocFile" mode="header3">
      <Header2>
         <xsl:copy-of select="G_H|FUN|oH|y"/>
         <xsl:apply-templates select="key('header3', concat(hd1, '|', Code, '|', G_H, '|', FUN, '|', oH, '|', y))"/>
      </Header2>
   </xsl:template>

   <xsl:template match="AllocFile">
      <allocheader>
         <xsl:copy-of select="alc|No|DT|AMOUNT"/>
      </allocheader>
   </xsl:template>
</xsl:stylesheet>

AllocFile तत्वों के मिलान वाले सभी टेम्पलेट्स के बीच भेद करने के लिए टेम्पलेट मिलान पर मोड विशेषता का उपयोग ध्यान दें।

जब आपके नमूना XML पर लागू होता है, तो निम्नलिखित आउटपुट होते हैं

<Header1>
   <Hd1>1234</Hd1>
   <CodeHeader>
      <Code>033195</Code>
      <Header2>
         <G_H>147</G_H>
         <FUN>125487</FUN>
         <oH>11</oH>
         <y>9</y>
         <allocheader>
            <alc>1</alc>
            <No>11/10</No>
            <DT>20090401</DT>
            <AMOUNT>8000000</AMOUNT>
         </allocheader>
         <allocheader>
            <alc>2</alc>
            <No>14/10</No>
            <DT>20090401</DT>
            <AMOUNT>8400000</AMOUNT>
         </allocheader>
         <allocheader>
            <alc>3</alc>
            <No>74/10</No>
            <DT>20090401</DT>
            <AMOUNT>8740000</AMOUNT>
         </allocheader>
      </Header2>
   </CodeHeader>
   <CodeHeader>
      <Code>033118</Code>
      <Header2>
         <G_H>117</G_H>
         <FUN>125487</FUN>
         <oH>19</oH>
         <y>9</y>
         <allocheader>
            <alc>2</alc>
            <No>74/10</No>
            <DT>20090401</DT>
            <AMOUNT>74512</AMOUNT>
         </allocheader>
      </Header2>
   </CodeHeader>
   <CodeHeader>
      <Code>033147</Code>
      <Header2>
         <G_H>117</G_H>
         <FUN>125487</FUN>
         <oH>19</oH>
         <y>9</y>
         <allocheader>
            <alc>3</alc>
            <No>14/10</No>
            <DT>20090401</DT>
            <AMOUNT>986541</AMOUNT>
         </allocheader>
      </Header2>
   </CodeHeader>
</Header1>

अगर आपके पास अलग एचडी 1 तत्व हैं, तो '1234' के अतिरिक्त आप कई हेडर 1 तत्वों के साथ समाप्त हो जाएंगे, और इसलिए आपका आउटपुट एक्सएमएल का अच्छी तरह से नहीं होगा। दस्तावेज़ तत्व से मेल खाने वाले प्रारंभिक टेम्पलेट को संशोधित करते हुए उन्हें मूल तत्व में लपेट करना काफी आसान होगा।

<xsl:template match="/XML">
   <Root>
      <xsl:apply-templates select="AllocFile[generate-id() = generate-id(key('header1', hd1)[1])]" mode="header1" />
   </Root>
</xsl:template>