Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
240 views
in Technique[技术] by (71.8m points)

A webservice call returned me a xml of 1000 workers. How can I split the file into multiple xml files containing 50 workers each using XSLT?

I have a xml file which is having 1000 workers with xpath env:Envelope/env:Body/wd:Get_Workers_Response/wd:Response_Data/wd:Worker

I need to split the file into multiple files based on the number of worker, say 50, using XSLT

My webservice response:

        <?xml version="1.0" encoding="utf-8"?>
    <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
        <env:Body>
            <wd:Get_Workers_Response xmlns:wd="urn:com.workday/bsvc" wd:version="v35.1">
                <wd:Response_Filter>
                    <wd:As_Of_Effective_Date>2021-01-04</wd:As_Of_Effective_Date>
                    <wd:As_Of_Entry_DateTime>2021-01-04T23:28:03.113-08:00</wd:As_Of_Entry_DateTime>
                    <wd:Page>1</wd:Page>
                    <wd:Count>100</wd:Count>
                </wd:Response_Filter>
                <wd:Response_Results>
                    <wd:Total_Results>2</wd:Total_Results>
                    <wd:Total_Pages>1</wd:Total_Pages>
                    <wd:Page_Results>2</wd:Page_Results>
                    <wd:Page>1</wd:Page>
                </wd:Response_Results>
                <wd:Response_Data>
                    <wd:Worker>
                        <wd:Worker_Data>
                            <wd:Worker_ID>1</wd:Worker_ID>
                            <wd:Name>aaaaaa</wd:Name>
                        </wd:Worker_Data>
                    </wd:Worker>
                    <wd:Worker>
                        <wd:Worker_Data>
                            <wd:Worker_ID>2</wd:Worker_ID>
                            <wd:Name>bbbbbb</wd:Name>
                        </wd:Worker_Data>
                    </wd:Worker>
                    <wd:Worker>
                        <wd:Worker_Data>
                            <wd:Worker_ID>3</wd:Worker_ID>
                            <wd:Name>cccccc</wd:Name>
                        </wd:Worker_Data>
                    </wd:Worker>

.....
..... 998 more workers

Desired Output:

File 1: Worker 1 to 50

                    <wd:Worker>
                        <wd:Worker_Data>
                            <wd:Worker_ID>1</wd:Worker_ID>
                            <wd:Name>aaaaaa</wd:Name>
                        </wd:Worker_Data>
                    </wd:Worker>
                    <wd:Worker>
                        <wd:Worker_Data>
                            <wd:Worker_ID>2</wd:Worker_ID>
                            <wd:Name>bbbbbb</wd:Name>
                        </wd:Worker_Data>
                    </wd:Worker>
...
...
                    <wd:Worker>
                        <wd:Worker_Data>
                            <wd:Worker_ID>50</wd:Worker_ID>
                            <wd:Name>xxxxx</wd:Name>
                        </wd:Worker_Data>
                    </wd:Worker>

File 2: Worker 51 to 100 ......

My XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wd="urn:com.workday/bsvc"
    exclude-result-prefixes="xs"
    version="2.0">
    
    <xsl:template match="wd:Response_Data">
        <xsl:for-each-group select="wd:Worker" group-adjacent="(position()-1) idiv 50">
            <xsl:result-document href="batch{position()}.xml">
                <batch nr="{position()}">
                    <xsl:copy-of select="current-group()"/>
                </batch>
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>
    
</xsl:stylesheet>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

In XSLT 2.0+

<xsl:template match="wd:Response_Data">
  <xsl:for-each-group select="wd:Worker" group-adjacent="(position()-1) idiv 50">
    <xsl:result-document href="batch{position()}.xml">
      <batch nr="{position()}">
        <xsl:copy-of select="current-group()"/>
      </batch>
    </xsl:result-document>
  </xsl:for-each-group>
</xsl:template>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...