Splitting XML document based on a child node value

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Subhankar Sahu

    #1

    Splitting XML document based on a child node value

    Hi All,

    I have a requirement to split an incoming XML document based on a child node value. Here is snippet of my source XML.

    Code:
    <Select_Groupid_Collection>
    <Select_Groupid_Output> 
      <USER_NAME>User1</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SE</DOC_TYPE> 
      <ARR_ID>ARR1</ARR_ID> 
    </Select_Groupid_Output>
    <Select_Groupid_Output> 
      <USER_NAME>User2</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SF</DOC_TYPE> 
      <ARR_ID>ARR2</ARR_ID> 
    </Select_Groupid_Output>
    <Select_Groupid_Output> 
      <USER_NAME>User3</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SF</DOC_TYPE> 
      <ARR_ID>ARR1</ARR_ID> 
    </Select_Groupid_Output>
    <Select_Groupid_Output> 
      <USER_NAME>User4</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SF</DOC_TYPE> 
      <ARR_ID>ARR3</ARR_ID> 
    </Select_Groupid_Output>
    <Select_Groupid_Output> 
      <USER_NAME>User5</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SE</DOC_TYPE> 
      <ARR_ID>ARR2</ARR_ID> 
    </Select_Groupid_Output>
    </Select_Groupid_Collection>
    I want the output to be split into 3 XMLs, based on ARR_ID. For each unique ARR_ID a separate XML has to be generated.

    xml1
    Code:
    <Select_Groupid_Collection>
    <Select_Groupid_Output> 
      <USER_NAME>User1</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SE</DOC_TYPE> 
      <ARR_ID>ARR1</ARR_ID> 
    </Select_Groupid_Output>
    <Select_Groupid_Output> 
      <USER_NAME>User3</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SF</DOC_TYPE> 
      <ARR_ID>ARR1</ARR_ID> 
    </Select_Groupid_Output>
    </Select_Groupid_Collection>
    xml2
    Code:
    <Select_Groupid_Collection>
    <Select_Groupid_Output> 
      <USER_NAME>User2</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SF</DOC_TYPE> 
      <ARR_ID>ARR2</ARR_ID> 
    </Select_Groupid_Output>
    <Select_Groupid_Output> 
      <USER_NAME>User5</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SE</DOC_TYPE> 
      <ARR_ID>ARR2</ARR_ID> 
    </Select_Groupid_Output>
    </Select_Groupid_Collection>
    xml3
    Code:
    <Select_Groupid_Collection>
    <Select_Groupid_Output> 
      <USER_NAME>User4</USER_NAME> 
      <DOC_DATE>2010-10-31T00:00:00.000-05:00</DOC_DATE> 
      <DOC_TYPE>SF</DOC_TYPE> 
      <ARR_ID>ARR3</ARR_ID> 
    </Select_Groupid_Output>
    </Select_Groupid_Collection>
    Any suggestions how this can be done using XSLT. I read about the grouping concept in XSLT from below link


    But not sure how the XML can be split..
    Last edited by Dormilich; Oct 22 '10, 11:57 AM.
  • jkmyoung
    Recognized Expert Top Contributor
    • Mar 2006
    • 2057

    #2
    Are you using XSLT 2.0? If so, XSLT 2.0 has a result-document function http://www.w3.org/TR/xslt20/#element-result-document

    Code:
    <xsl:result-document href="arr1.xml">
    I can't recall if the href can be set dynamically, eg in braces {}.

    If you're not using XSLT 2.0 the solution may depend on your transformation engine (many of which have similar functionality) or you might have to run the same transformation several times. If so, I suggest creating 1 XSLT with a parameter you can pass in as opposed to creating multiple XSLT stylesheets.

    Comment

    Working...