1

I need to update event and eventReason of Job from Job_event based on values by comparing fields "startdate", "J_Seq_Number" of Job with fields "eventDate", "JE_Seq_Number" of Job_event. Any help would be appreciate, Thank you.

Input XML

 <Response>
    <Employee>
        <ID>1234</ID>
        <Person>
            <personalData>
                <firstname>FirstName</firstname>
                <lastname>Lastname</lastname>
            </personalData>
            <address>
                <address1>test</address1>
            </address>
            <Job>
                <startDate>2022-01-01</startDate>
                <event>1J</event>
                <eventReason>1J_ER</eventReason>
                <J_Seq_Number>2</J_Seq_Number>
            </Job>
            <Job>
                <startDate>2022-01-01</startDate>
                <event>1J</event>
                <eventReason>1J_ER</eventReason>
                <J_Seq_Number>1</J_Seq_Number>
            </Job>
            <Job>
                <startDate>2022-02-01</startDate>
                <event>3J</event>
                <eventReason>3J_ER</eventReason>
                <J_Seq_Number>1</J_Seq_Number>
            </Job>
            <Job_event>
                <eventDate>2022-01-01</eventDate>
                <event>1JE_Update</event>
                <eventReason>1JE_ER_Update</eventReason>
                <JE_Seq_Number>2</JE_Seq_Number>
            </Job_event>
            <Job_event>
                <eventDate>2022-01-01</eventDate>
                <event>2JE_Update</event>
                <eventReason>2JE_ER_Update</eventReason>
                <JE_Seq_Number>1</JE_Seq_Number>
            </Job_event>
            <Job_event>
                <eventDate>2022-02-01</eventDate>
                <event>3JE_Update</event>
                <eventReason>3JE_ER_Update</eventReason>
                <JE_Seq_Number>1</JE_Seq_Number>
            </Job_event>
        </Person>
    </Employee>
</Response>

        

Expect output XML, Event in Job has been updated from Job Event by comparing

<Response>
    <Employee>
        <ID>1234</ID>
        <Person>
            <personalData>
                <firstname>FirstName</firstname>
                <lastname>Lastname</lastname>
            </personalData>
            <address>
                <address1>test</address1>
            </address>
            <Job>
                <startDate>2022-01-01</startDate>
                <event>1JE_Update</event>
                <eventReason>1JE_ER_Update</eventReason>
                <J_Seq_Number>2</J_Seq_Number>
            </Job>
            <Job>
                <startDate>2022-01-01</startDate>
                <event>2JE_Update</event>
                <eventReason>2JE_ER_Update</eventReason>
                <J_Seq_Number>1</J_Seq_Number>
            </Job>
            <Job>
                <startDate>2022-02-01</startDate>
                <event>3JE_Update</event>
                <eventReason>3JE_ER_Update</eventReason>
                <J_Seq_Number>1</J_Seq_Number>
            </Job>
            <Job_event>
                <eventDate>2022-01-01</eventDate>
                <event>1JE_Update</event>
                <eventReason>1JE_ER_Update</eventReason>
                <JE_Seq_Number>2</JE_Seq_Number>
            </Job_event>
            <Job_event>
                <eventDate>2022-01-01</eventDate>
                <event>2JE_Update</event>
                <eventReason>2JE_ER_Update</eventReason>
                <JE_Seq_Number>1</JE_Seq_Number>
            </Job_event>
            <Job_event>
                <eventDate>2022-02-01</eventDate>
                <event>3JE_Update</event>
                <eventReason>3JE_ER_Update</eventReason>
                <JE_Seq_Number>1</JE_Seq_Number>
            </Job_event>
        </Person>
    </Employee>
</Response>

1 Answers1

1

For that single Employee/Person document it should suffice to use

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    expand-text="yes"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>
  
  <xsl:key name="job_event" match="Job_event" composite="yes" use="eventDate, JE_Seq_Number"/>

  <xsl:template match="Job[key('job_event', (startDate, J_Seq_Number))]/event">
    <xsl:copy>{key('job_event', ../(startDate, J_Seq_Number))/event}</xsl:copy>
  </xsl:template>
  
  <xsl:template match="Job[key('job_event', (startDate, J_Seq_Number))]/eventReason">
    <xsl:copy>{key('job_event', ../(startDate, J_Seq_Number))/eventReason}</xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>
Martin Honnen
  • 160,499
  • 6
  • 90
  • 110
  • Thanks Martin, This worked for single Employee/Person. Can you please help me how can i loop if there are multiple Employee/Person. – vinay kumar Sep 09 '22 at 14:19
  • @vinaykumar, edit your question and show a second input and wanted output sample that shows what kind of data you have and how you want to map it. Assuming you want the references to be treated locally to a `Employee/Person` I would think that using e.g. `Job[key('job_event', (startDate, J_Seq_Number), ancestor::Person)]/event` and `key('job_event', ../(startDate, J_Seq_Number), ancestor::Person)/event` might suffice (with the same changes done in the other template). – Martin Honnen Sep 09 '22 at 14:41