2010-12-13 11 views
5

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

<Items> 
    <Item> 
    <Title>Title 1</Title> 
    <DueDate>01-02-2008</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 2</Title> 
    <DueDate>01-02-2009</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 3</Title> 
    <DueDate>01-02-2010</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 4</Title> 
    <DueDate>01-02-2011</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 5</Title> 
    <DueDate>01-02-2012</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 6</Title> 
    <DueDate>01-02-2013</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 7</Title> 
    <DueDate>01-02-2013</DueDate> 
    </Item> 
</Items> 

3 की दहलीज मूल्य के आधार पर वांछित आउटपुट, तीन फ़ाइलें, जिनमें से दो को शामिल 3 "आइटम" होगा, और पिछले एक शेष युक्त

यहां नमूने के इनपुट एक्सएमएल फ़ाइल है "आइटम", जो एक होगा।

यहां मेरे एक्सएसएलटी का नमूना है जो मुझे प्रत्येक आइटम के लिए विभाजित करने की अनुमति देता है, जिसके परिणामस्वरूप सात अलग-अलग फाइलें होती हैं, हालांकि, मेरी इच्छा है कि "आइटम" की एक निश्चित सीमा के आधार पर फ़ाइल के आकार को सीमित करना है। प्रति फ़ाइल नोड।

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xsl:output method="xml" indent="yes" name="xml" /> 

<xsl:template match="/"> 

<xsl:for-each select="//Item"> 
    <xsl:variable name="nTitle" select="Title"/> 
    <xsl:variable name="filename" select="concat('Items\',$nTitle,'-','.xml')" /> 
    <xsl:value-of select="$filename" /> 
    <xsl:result-document href="{$filename}" format="xml"> 
     <xsl:copy-of select="."/> 
    </xsl:result-document> 
</xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 
+0

अच्छा प्रश्न, +1। एक साधारण समाधान के लिए मेरा जवाब देखें। –

उत्तर

6

यह स्टाइलशीट:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="pItemsNumber" select="3"/> 
    <xsl:template match="Items"> 
     <xsl:for-each-group select="Item" 
          group-adjacent="(position()-1) idiv $pItemsNumber"> 
      <xsl:result-document href="Items\{current-grouping-key()}.xml"> 
       <Items> 
        <xsl:copy-of select="current-group()"/> 
       </Items> 
      </xsl:result-document> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

आउटपुट:

<?xml version="1.0" encoding="UTF-8"?> 
<Items> 
    <Item> 
     <Title>Title 1</Title> 
     <DueDate>01-02-2008</DueDate> 
    </Item> 
    <Item> 
     <Title>Title 2</Title> 
     <DueDate>01-02-2009</DueDate> 
    </Item> 
    <Item> 
     <Title>Title 3</Title> 
     <DueDate>01-02-2010</DueDate> 
    </Item> 
</Items> 

<?xml version="1.0" encoding="UTF-8"?> 
<Items> 
    <Item> 
     <Title>Title 4</Title> 
     <DueDate>01-02-2011</DueDate> 
    </Item> 
    <Item> 
     <Title>Title 5</Title> 
     <DueDate>01-02-2012</DueDate> 
    </Item> 
    <Item> 
     <Title>Title 6</Title> 
     <DueDate>01-02-2013</DueDate> 
    </Item> 
</Items> 

<?xml version="1.0" encoding="UTF-8"?> 
<Items> 
    <Item> 
     <Title>Title 7</Title> 
     <DueDate>01-02-2013</DueDate> 
    </Item> 
</Items> 

संपादित करें: ऊप्स!

+0

धन्यवाद अलेजैंड्रो, जिसने नौकरी की थी। – Brian

+0

@ ब्रायन: आपका स्वागत है। –

-1

आप अपने लूप के बाहर घोषित काउंटर को कार्यान्वित कर सकते हैं। जब काउंटर 3 हिट करता है, तो इसे रीसेट करें और एक नया फ़ाइल नाम सेट करें। अन्यथा, मौजूदा फ़ाइल नाम में वृद्धि और संलग्न करें।

0

यह परिवर्तन:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:param name="pSplitNum" select="3"/> 

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Item[position() mod $pSplitNum eq 1]"> 
    <xsl:result-document href= 
    "file{position()}-{min((position()+$pSplitNum -1, count(/*/Item)))}.xml"> 
    <Items> 
     <xsl:call-template name="identity"/> 
     <xsl:apply-templates mode="copy" select= 
     "following-sibling::Item[position() lt $pSplitNum]"/> 
    </Items> 
    </xsl:result-document> 
</xsl:template> 
<xsl:template match="/*"><xsl:apply-templates/></xsl:template> 
<xsl:template match="Item[position() mod $pSplitNum ne 1]"/> 
</xsl:stylesheet> 

जब प्रदान की XML दस्तावेज़ पर लागू:

<Items> 
    <Item> 
    <Title>Title 1</Title> 
    <DueDate>01-02-2008</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 2</Title> 
    <DueDate>01-02-2009</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 3</Title> 
    <DueDate>01-02-2010</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 4</Title> 
    <DueDate>01-02-2011</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 5</Title> 
    <DueDate>01-02-2012</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 6</Title> 
    <DueDate>01-02-2013</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 7</Title> 
    <DueDate>01-02-2013</DueDate> 
    </Item> 
</Items> 

का उत्पादन करना चाहता था तीन एक्सएमएल फ़ाइलें:

Saxon 9.1.0.5J from Saxonica 
Java version 1.6.0_22 
Stylesheet compilation time: 645 milliseconds 
Processing file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml 
Building tree for file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml using class net.sf.saxon.tinytree.TinyBuilder 
Tree built in 10 milliseconds 
Tree size: 38 nodes, 119 characters, 0 attributes 
Loading net.sf.saxon.event.MessageEmitter 
Writing to file:/C:/Program%20Files/Java/jre6/bin/file1-3.xml 
Writing to file:/C:/Program%20Files/Java/jre6/bin/file4-6.xml 
Writing to file:/C:/Program%20Files/Java/jre6/bin/file7-7.xml 
Execution time: 101 milliseconds 
Memory used: 11453088 
NamePool contents: 20 entries in 20 chains. 6 prefixes, 7 URIs 

ध्यान दें है:

  1. यह पहचान शासन पद्धति का एक सरल अनुप्रयोग है।

  2. हर Item एक नई फ़ाइल शुरू करने मिलान किया जाता है और यह एक शीर्ष तत्व में रैपिंग का कारण बनता है, जो अपने आप और अगले $ pSplitNum -1 के प्रसंस्करण (या जो भी पिछले समूह में रहता है), और एक के रूप में इस outputting एकल परिणाम-दस्तावेज़ (फ़ाइल)।

  3. बनाई गई हर फ़ाइल का नाम है: "filex-y.xml", जहां x और y शुरू करने और Item तत्वों फ़ाइल में लिखा की न खत्म होने वाली अनुक्रमण करता है।

  4. प्रत्येक Item जो एक नई फ़ाइल शुरू नहीं कर रहा है खाली मिलान टेम्पलेट द्वारा हटा दिया गया है। ऐसे तत्व "प्रतिलिपि" मोड में संसाधित होते हैं।

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