2010-11-12 6 views
5

मेरे पास एक एक्सएसएलटी फ़ाइल है ताकि बड़ी मात्रा में डेटा बदल सके। मैं एक "विभाजित" कार्यक्षमता जोड़ना चाहता हूं, या तो एक जंजीर एक्सएसएलटी या वर्तमान एक्सएसएलटी के भीतर जो कई आउटपुट फाइलें बना सकता है ताकि फाइलों के आकार को किसी निश्चित दहलीज के नीचे सीमित किया जा सके। मान लेते हैं कि इनपुट XML रूप में नीचे है दो:एक्सएसएलटी विभाजित आउटपुट फाइलें - मुएनचियन ग्रुपिंग

<People> 
<Person>    
<name>John</name>    
<date>June12</date>    
<workTime taskID="1">34</workTime>    
<workTime taskID="2">12</workTime>    
</Person>    
<Person>    
<name>John</name>    
<date>June13</date>    
<workTime taskID="1">21</workTime>    
<workTime taskID="2">11</workTime>    
</Person> 
<Person>    
<name>Jack</name>    
<date>June19</date>    
<workTime taskID="1">20</workTime>    
<workTime taskID="2">30</workTime>    
</Person>  
</People> 

XSLT फ़ाइल muenchian समूहीकरण का उपयोग कर नीचे के रूप में है।

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:key name="PersonTasks" match="workTime" use="concat(@taskID, ../name)"/> 
<xsl:template match="/"> 
    <People> 
    <xsl:apply-templates select="//workTime[generate-id() = generate-id(key('PersonTasks',concat(@taskID, ../name))[1])]"/> 
    </People> 
</xsl:template> 

<xsl:template match="workTime"> 
    <xsl:variable name="taskID"> 
     <xsl:value-of select="@taskID"/> 
    </xsl:variable> 
    <xsl:variable name="name"> 
     <xsl:value-of select="../name"/> 
    </xsl:variable> 
    <Person> 
     <name> 
      <xsl:value-of select="$name"/> 
     </name> 
     <taskID> 
      <xsl:value-of select="$taskID"/> 
     </taskID> 
     <xsl:for-each select="//workTime[../name = $name][@taskID = $taskID]"> 
      <workTime> 
       <date> 
        <xsl:value-of select="../date"/> 
       </date> 
       <time> 
        <xsl:value-of select="."/> 
       </time> 
      </workTime> 
     </xsl:for-each> 
    </Person> 
</xsl:template> 
</xsl:stylesheet> 

हालांकि, मुझे एक आउटपुट के रूप में, एक बड़ी संख्या के बजाय नीचे की गई कई फाइलें चाहिए। इस उदाहरण के लिए, मैंने प्रति फ़ाइल केवल एक नाम सेट किया है .. लेकिन यह एक पैरामीटर होना चाहिए।

पहले व्यक्ति के लिए आउटपुट फ़ाइल:

<People> 
    <Person> 
     <name>John</name> 
     <taskID>1</taskID> 
     <workTime> 
     <date>June12</date> 
     <time>34</time> 
     </workTime> 
     <workTime> 
     <date>June13</date> 
     <time>21</time> 
     </workTime> 
    </Person> 
    <Person> 
     <name>John</name> 
     <taskID>2</taskID> 
     <workTime> 
     <date>June12</date> 
     <time>12</time> 
     </workTime> 
     <workTime> 
     <date>June13</date> 
     <time>11</time> 
     </workTime> 
    </Person> 
</People> 

दूसरे व्यक्ति के लिए आउटपुट फ़ाइल:

<People> 
    <Person> 
     <name>Jack</name> 
     <taskID>1</taskID> 
     <workTime> 
     <date>June19</date> 
     <time>20</time> 
     </workTime> 
    </Person> 
    <Person> 
     <name>Jack</name> 
     <taskID>2</taskID> 
     <workTime> 
     <date>June19</date> 
     <time>30</time> 
     </workTime> 
    </Person> 
</People> 

क्या पसंद किया और सबसे सुरुचिपूर्ण दृष्टिकोण XSLT 1.0 का उपयोग कर सकता है? एक्सएसएलटी के भीतर एक जंजीर एक्सएसएलटी को कॉल करने का कोई तरीका है ताकि आउटपुट फाइलों को विभाजित किया जा सके?

चीयर्स।

+0

अच्छा सवाल है, +1। ऐसा करने के कई तरीकों के लिए मेरा उत्तर देखें। –

उत्तर

6

वहाँ एक रास्ता इतनी के रूप में उत्पादन फ़ाइलों को विभाजित करने के XSLT के भीतर एक श्रृंखलित XSLT कॉल करने के लिए है?

के कुछ तरीके:

  1. आप इस करने के लिए एक विस्तार समारोह लिख सकता है - अपने XSLT प्रोसेसर के दस्तावेजीकरण की जाँच करें।

  2. EXSLT की <exsl:document> विस्तार तत्वों का उपयोग करें, इस मामले में यह अपने XSLT प्रोसेसर <saxon:output> विस्तार तत्व यदि आपके पास सैक्सन 6.x

  3. में

  4. उपयोग के द्वारा समर्थित है आपकी प्रोग्रामिंग भाषा से एक लूप एक अलग परिवर्तन का आह्वान करता है, जिसके परिणामस्वरूप उस व्यक्ति का नाम पैरामीटर होता है जिसके परिणामस्वरूप परिणाम उत्पन्न होते हैं।

यहाँ 2. और 3 के लिए कोड उदाहरण हैं।इसके बाद के संस्करण:

<saxon:output> का उपयोग करना:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:saxon="http://icl.com/saxon" 
    extension-element-prefixes="saxon" > 

<xsl:template match="/"> 
    <xsl:for-each select="/*/*[not(. > 3)]"> 
    <saxon:output href="c:\xml\doc{.}"> 
    <xsl:copy-of select="."/> 
    </saxon:output> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव निम्नलिखित XML दस्तावेज़ पर लागू किया जाता है:

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

तीन फाइलें: c:\xml\doc1, c:\xml\doc2 और c:\xml\doc3 चाहता था सामग्री के साथ बनाई गई हैं ।

एक ही उदाहरण <exslt:document> का उपयोग कर:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
    extension-element-prefixes="saxon" > 

<xsl:template match="/"> 
    <xsl:for-each select="/*/*[not(. > 3)]"> 
    <ext:document href="c:\xml\doc{.}"> 
    <xsl:copy-of select="."/> 
    </ext:document> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
+0

मुझे लगता है कि exsl: दस्तावेज़ सबसे अच्छा विचार प्रतीत होता है। क्या आपके पास कोई विशेष जानकारी है कि यह विशेष उदाहरण के लिए कैसे काम करेगा? – Daniel

+0

@ डैनियल: मैंने दो कोड उदाहरण जोड़े: '' और '' –

+0

@Dimitre के लिए। धन्यवाद और क्या आपके पास कुछ अंतर्दृष्टि है कि प्रश्न में समूह XSLT के साथ आपके समाधान को कैसे बदला जा सकता है? – Daniel

संबंधित मुद्दे