user2326530
user2326530

Reputation: 13

XSL to have same parent element to each child

Please help to convert following xml to required format using xslt

each elements like clock In, Clock Out, Break Start, Break End needs to have TASDATA element as e separate parent

Actual XML:

<?xml version="1.0" encoding="UTF-8"?>
<tXML>
  <Header>
    <Source>TASSRC</Source>
    <Action_Type>Create</Action_Type>
    <Batch_ID>TASBTID</Batch_ID>
    <Reference_ID>TASRFID</Reference_ID>
    <User_ID>TASUSR</User_ID>
    <Password>TASPWD</Password>
    <Message_Type>TAS</Message_Type>
    <Company_ID>810</Company_ID>
    <Purpose_Code>TAS</Purpose_Code>
    <Msg_Locale>en.US</Msg_Locale>
    <Version>1.0</Version>
    <Sequence_Number>TAS&amp;</Sequence_Number>
  </Header>
  <Message>
    <TimeAndAttendance>
      <TASData>
        <ClockIn>
          <TranNumber>000000001</TranNumber>
          <Warehouse>810</Warehouse>
          <EmployeeUserId>173633</EmployeeUserId>
          <EmpClockIn>2012-08-06T05:04:00</EmpClockIn>
        </ClockIn>
        <BreakStart>
          <TranNumber>000000002</TranNumber>
          <Warehouse>810</Warehouse>
          <EmployeeUserId>173633</EmployeeUserId>
          <BreakStartTime>2012-08-06T11:05:00</BreakStartTime>
          <Activity>UNPAIDBRK</Activity>
        </BreakStart>
        <BreakEnd>
          <TranNumber>000000003</TranNumber>
          <Warehouse>810</Warehouse>
          <EmployeeUserId>173633</EmployeeUserId>
          <BreakStartTime>2012-08-06T11:05:00</BreakStartTime>
          <BreakEndTime>2012-08-06T11:31:00</BreakEndTime>
          <Activity>UNPAIDBRK</Activity>
        </BreakEnd>
        <ClockOut>
          <TranNumber>000000004</TranNumber>
          <Warehouse>810</Warehouse>
          <EmployeeUserId>173633</EmployeeUserId>
          <EmpClockOut>2012-08-06T15:29:00</EmpClockOut>
        </ClockOut>
      </TASData>
    </TimeAndAttendance>
  </Message>
</tXML>

Required XML:

<?xml version="1.0" encoding="UTF-8"?>
<tXML>
  <Header>
    <Source>TASSRC</Source>
    <Action_Type>Create</Action_Type>
    <Batch_ID>TASBTID</Batch_ID>
    <Reference_ID>TASRFID</Reference_ID>
    <User_ID>TASUSR</User_ID>
    <Password>TASPWD</Password>
    <Message_Type>TAS</Message_Type>
    <Company_ID>810</Company_ID>
    <Purpose_Code>TAS</Purpose_Code>
    <Msg_Locale>en.US</Msg_Locale>
    <Version>1.0</Version>
    <Sequence_Number>TAS&amp;</Sequence_Number>
  </Header>
  <Message>
    <TimeAndAttendance>
      <TASData>
        <ClockIn>
          <TranNumber>000000001</TranNumber>
          <Warehouse>810</Warehouse>
          <EmployeeUserId>173633</EmployeeUserId>
          <EmpClockIn>2012-08-06T05:04:00</EmpClockIn>
        </ClockIn>
      </TASData>
      <TASData>
        <BreakStart>
          <TranNumber>000000002</TranNumber>
          <Warehouse>810</Warehouse>
          <EmployeeUserId>173633</EmployeeUserId>
          <BreakStartTime>2012-08-06T11:05:00</BreakStartTime>
          <Activity>UNPAIDBRK</Activity>
        </BreakStart>
      </TASData>
      <TASData>
        <BreakEnd>
          <TranNumber>000000003</TranNumber>
          <Warehouse>810</Warehouse>
          <EmployeeUserId>173633</EmployeeUserId>
          <BreakStartTime>2012-08-06T11:05:00</BreakStartTime>
          <BreakEndTime>2012-08-06T11:31:00</BreakEndTime>
          <Activity>UNPAIDBRK</Activity>
        </BreakEnd>
      </TASData>
      <TASData>
        <ClockOut>
          <TranNumber>000000004</TranNumber>
          <Warehouse>810</Warehouse>
          <EmployeeUserId>173633</EmployeeUserId>
          <EmpClockOut>2012-08-06T15:29:00</EmpClockOut>
        </ClockOut>
      </TASData>
    </TimeAndAttendance>
  </Message>
</tXML>

Upvotes: 1

Views: 138

Answers (1)

StuartLC
StuartLC

Reputation: 107237

This should do the trick - it intercepts existing TimeAndAttendance/TASData nodes and wraps each child in a new TASData element:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>

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

    <xsl:template match="TimeAndAttendance/TASData">
        <xsl:apply-templates select="*" mode="AddTASDataParent"/>
    </xsl:template>

    <xsl:template match="*" mode="AddTASDataParent">
        <TASData>
            <xsl:copy-of select="."/>
        </TASData>
    </xsl:template>

</xsl:stylesheet>

Upvotes: 1

Related Questions